객체 생성 로직을 사용하는 코드와 분리하여 유연성과 재사용성을 높이는 객체 생성 패턴.
이를 통해 코드의 결합도를 낮추고 유지보수와 확장이 용이해진다.
- 객체를 생성하는 로직(구현 세부 사항)을 상위 클래스나 별도의 "팩토리"클래스에 위임
- 객체를 사용하는 코드는 구체적인 객체 생성 방식에 대해 알 필요 없이 추상화된 인터페이스나 부모 클래스 객체를 다룬다.
- 상위 클래스는 객체 생성의 뼈대(공통된 인터페이스)를 정의
- 하위 클래스는 객체 생성에 대한 구체적인 구현을 제공
이로 인해 상위 클래스는 구체적인 하위 클래스에 대한 의존 없이 동작 가능
- 객체 생성 로직이 분리되어, 새로운 객체를 추가하거나 생성 방식을 변경할 때도한곳만 수정하면 된다.
- 코드의 수정 범위가 좁아져 유지보수성이 높아짐.
팩토리 패턴 미사용
class Latte {
constructor() {
this.name = "Latte";
}
}
class Americano {
constructor() {
this.name = "Americano";
}
}
// 사용하는 코드
const latte = new Latte();
const americano = new Americano();
console.log(latte.name); // Latte
console.log(americano.name); // Americano
Latte와 Americano 객체를 생성할 때 사용하는 코드가 직접 객체를 생성한다.
새로운 음료 클래스를 추가하거나 변경할경우 객체를 사용하는 모든 코드를 수정해야 한다.
팩토리 패턴 사용
// 추상화된 상위 클래스 (부모 클래스)
class Coffee {
constructor(name) {
this.name = name;
}
}
// 구체적인 하위 클래스
class Latte extends Coffee {
constructor() {
super("Latte");
}
}
class Americano extends Coffee {
constructor() {
super("Americano");
}
}
// 팩토리 클래스
class CoffeeFactory {
static createCoffee(type) {
switch (type) {
case "Latte":
return new Latte();
case "Americano":
return new Americano();
default:
throw new Error("Invalid coffee type");
}
}
}
// 사용하는 코드
const latte = CoffeeFactory.createCoffee("Latte");
const americano = CoffeeFactory.createCoffee("Americano");
console.log(latte.name); // Latte
console.log(americano.name); // Americano
객체 생성 로직이 CoffeeFactory 클래스에 모여 있어, 사용하는 코드에서 객체 생성 방식을 알 필요가 없다.
새로운 음료를 추가하려면 팩토리 클래스만 수정하면 된다.