객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴
즉, 상속 관계에 있는 두 클래스에서 상위 클래스가 중요 뼈대를 결정(ex. 공장)하고, 하위 클래스에서 객체 생서엥 관한 구체적인 내용을 결정하는 패턴.
상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며, 상위 클래스에서는 인스턴스 생성방식에 관여할 필요없고 구조만 제공하기 때문에 유연성을 갖게된다. 그래서 객체 생성 로직이 따로 있기에, 코드 리펙터링을 할 때 매우 유용하다. -> 유지 보수성이 좋다
class Soda {
constructor() {
this.name = "Soda"
}
}
class Water {
constructor {
this.name = "Water"
}
}
class SodaFactory{
static createDrink() {
return new Soda()
}
}
class WaterFactory {
static createDrink() {
return new Water()
}
}
const factoryList = { SodaFactory, WaterFactory }
class DrinkFactory {
static createDrink(type) {
const factory = factoryList[type]
return factory.createDrink()
}
}
const main = () => {
// 음료를 주문한다.
const drink = CoffeeFactory.createDrink("SodaFactory")
// 음료 이름을 부른다.
console.log(drink.name) // Soda
}
main()
DrinkFactory라는 상위 클래스가 뼈대를 짓고, 하위 클래스인 SodaFactory가 구체적인 객체를 결정하고 있다. 이는 싱글톤 패턴에서 본 의존성 주입과 같다고 볼 수 있다. DrinkFactory에서 Sodafactory의 인스턴스를 생성한 것이 아닌, SodaFactory에서 생성한 인스턴스를 DrinkFacotry에 넣고있기 때문이다.
+) DrinkFactory에서 createDrink를 static으로 정적 메서드 형식으로 정의하였는데, 이처럼 정적 메서드를 사용하면 클래스의 인스턴스없이 호출이 가능(메모리 절약)하여 개별 인스턴스에 묶이지 않아 클래스 내의 함수를 정의할 수 있다