팩토리 메서드 패턴은 생산자(Creator)에서 createPizza()라는 팩토리 메서드를 통해,
*하나의 제품(Product)을 만드는 책임을 **상속(is-a)*을 통해 자식 클래스에게 위임하는 패턴이였다.
public abstract class PizzaStore {
// 1. 변하지 않는 공정은 final로 통제
public final Pizza orderPizza(String type) {
Pizza pizza;
// 2. 변해야 하는 생성은 자식에게 위임
pizza = createPizza(type)**;**
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
// 3. 자식이 반드시 구현해야 할 팩토리 메서드
abstract Pizza createPizza(String type);
}
그 예로 PizzaStore(추상 클래스)가 final orderPizza()라는 변하지 않는 공정을 직접 정의하고 통제했다. 그리고 abstract createPizza()라는 변해야 하는 생성 책임을 NYPizzaStore 같은 구상 생산자에게 위임했다.
이 구조는 공장(PizzaStore)이 구체적인 제품에 직접 의존하지 않고, 오직 추상화 제품(Pizza)에만 의존하도록 만들어 DIP와 OCP를 만족시켰다.
하지만, 이 설계에도 불구하고 피자 가게에는 아직 해결되지 않은 문제가 존재합니다.
*NYStyleCheesePizza의 코드는 DIP(의존관계 역전 원칙)를 또 다른 수준에서 위반하고 있다.*
(또 다른 수준이라 말은 DIP 위반을 두 번 발견했다는 뜻!)