개요


Factory Pattern은 Creational Pattern 중의 하나이다. 아래은 GoF의 Design Pattern Categorization이다. 여기서 Purpose는 Design Pattern의 목적과 관련된 것이다. 즉, Creation은 Class의 생성에 관련된 것이고 Structure는 Object 구조에 대한 것이고, Behavior는 Object의 동작에 관한 것이다. Scope은 Design Pattern이 적용되는 범위이다. 즉, Class의 경우는 class들 같으 관계에 관한 것으로 static하고 compile-time에 결정이 된다. 하지만, Object의 경우는 Object간의 관계에 관한 것이고 더 Dynamic하다.





여기서는 Factory Method에 대해서 살펴 보자. Factory Method은 Creational 이면셔 Class에 적용되는 패턴이다. 


Head First의 이야기

Head First[1]에서는 Pizza Restaurant를 예를 들어 Factory Method를 설명한다.


이야기 한데로, Head First에서는 Pizza 가게의 예를 들어 Design Pattern을 설명한다. 이야기의 흐름은 다음과 같다. 우선 Pizza를 주문하는 Method(orderPizza)를 생각해 보자. Pizza Instance를 생성하고, 준비(prepare), 굽고(bake), 자르고(cut), 포장하고(box) 그리고 완성된 Pizz를 제공하는 것이라고 하자. 그런데,리고, Pizza의 종류 또한 여러 가지가 될 수 있다. 여기서는 cheese, pepperoni, veggie와 같이 Pizza가 늘어 날 수록 orderPizza에서는 종류에 따라 다르게 생성하고 이를 추가해야 한다. 즉, Pizza가 추가 될 때마다 orderPizza가 계속 영향을 받게 된다. 그렇게 하기 위해서 다음 2가지를 수행해야 한다.

1. Pizza를 Abstraction한다.  (Pizza Abstract Class)

2. prepare, bake, cut, box를 지원하는 concrete pizza를 구현한다. (Concrete Pizza Classes)

3. Creation하는 부분을 분리한다. (Factory Method Class)


Class Diagram으로 표시하면 아래와 같은 구조가 된다. 여기까지가 Simple Factory이다. Factory까지 추상화 해야 Factory Method가 된다.



이제 이 장사 잘 되는 Pizza가게를 프렌차이즈로 만들어 보자. 하지만, 이 피자가게가 모두 같지 않고 지역별로 조금씩 특징이 있을 수 있다. 예를 들자면, New York, Chicago, California등이 그 예이다. 그러면, 이 Factory의 경우도 Abstraction이 필요하다 


여기까지 구현한 것이 Factory Method이다. 그래서, 아래와 같은 Class Diagram을 가질 수 있다.




GoF DP의 요약 과 Quick Reference

GoF 책[2]에서 설명하는 의도는 "하나의 object를 생성하려는 interface를 정의한다. 그리고, subclass가 어떤 class가 instantiate될지 결정하게 한다. 즉, Factory Method는 하나의class가 subclass들의 생성을 분리(defer)한다."라고 되어 있다. [3],에서 해당하는 class diagram은 아래와 같다. 사실 같은 내용이다.




관련 Object-Oriented Principle

Factory Method가 관련된 SOLID Principle은 Dependency Inversion Principle라고 할 수 있다. DIP에서 많이 드는 예는 Layered Architecture에서 하위 Interface를 상위에스 Reference하게 만드는 것이다. 아래의 예에서 상위 Layer는 하위 Layer에 Dependency를 가진다. 즉, 하위 Layer가 변경되면 상위 Layer도 영향을 받게 된다. 어떻게 이 Dependency를 끊을 수 있을까? 아래 그립과 같이 하위 Layer의 Interface를 만들어 상위 Layer에 두는 것이다. 즉, 하위 Layer가 상위 Layer에 Dependency가 생겨서 Inversion이 생겼다. 이 구조에서는 하위 Layer의 구조가 상위 Layer의 Interface에 제약되므로 이를 벗어날 수 없다. 아이러니하게도 상호 종속되어 나빠질 것 같지만, 서로에 약속에 의해서 제약된 것 이외에는 자유로워 졌다.



Factory Method에서는 Product와 Creator가 하위 Layer로 볼 수 있다. 그러므로 이것들의 Abstract인 Interface를 활용하면 이를 사용하는Client와 Product, Creator를 Loosely Coupling하게 할 수 있다.


References

[1] Eric Freeman and Elsabeth Freeman, "Head First Design Patterns," OReilly

[2] Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, "Design Patterns: Elements of Reusable Object-Oriented Software," Adisson-Wesley

[3] Design Pattern Quick Reference: http://www.mcdonaldland.info/2007/11/28/40/

+ Recent posts