작성: 한동훈(traxacun at unitel.co.kr)
GoF 책에 소개된 생성 패턴은 5가지가 있으며, 이들은 각각 Abstract Factory, Builder, Factory Method, Prototype, Singleton 이다.
Factory Method Pattern
[그림 1] Factory Method
Factory Method 패턴을 나타낸것이며 조금 복잡해 보일 수도 있다. 하나씩 살펴보면 Product 클래스를 상속한 ConcreteProductA, ConcreteProductB와 같이 실제 클래스를 만들 수 있다. 이들 클래스는 모두 Conceptual subclass이다. Creator 클래스와 ConcreteCreator 클래스의 관계도 Conceptual subclass를 나타내며 주석에서 알 수 있는 것처럼 ConcreteCreator.FactoryMethod에서 실제 ConcreteProduct 클래스를 반환한다.
위와 같은 생성 패턴을 어떻게 이용하는지 알아보는 가장 좋은 방법은 실제로 위 패턴을 이용하는 코드를 살펴보는 것이다. 위 패턴을 사용하는 코드는 다음과 같다.
[그림 2] Tester 클래스
Creator와 ConcreteCreator 사이의 생성은 Simple Factory를 이용한다는 것을 알 수 있으며 해당하는 ConcreteCreator 클래스의 FactoryMethod()를 통해서 적절한 Product 클래스의 인스턴스를 가져오는 것을 알 수 있다. 즉, Creator 클래스는 객체 생성을 위한 인터페이스를 정의하지만 객체 생성에는 관여하지 않는다. 객체 생성에 대한 책임을 ConcreteCreator 클래스에 두는 것을 알 수 있다. 실제로 Creator와 ConcreteCreator 클래스의 관계는 Template Method와 비슷한 점이 있다. 이에 대해서는 나중에 Template Method 패턴의 클래스 다이어그램과 직접 비교해 보기 바란다. 위 클래스 다이어그램이 나타내는 것을 모두 코드로 옮기면 다음과 같다.
[그림 3] Product 클래스
[그림 4] ConcreteProductA 클래스
[그림 5] ConcreteProductB 클래스
[그림 6] Creator 클래스
[그림 7] ConcreteCreatorA 클래스
[그림 8] ConcreteCreatorB 클래스
보다 자세한 설명은 다른 디자인 패턴을 참고하기 바란다. 그러나 여기서 한번 짚고 넘어가야 할 것이 있다. 문서를 처리하는 Document 클래스와 문서를 화면에 보여줄 것을 처리하는 View 클래스가 있다고 가정하자. 문서를 보여주기만 하는 TextDocument 클래스, 문서를 편집하는 TextEditorDocument 클래스가 있고, 마찬가지로 TextView 클래스와 TextEditorView 클래스가 있는 경우 Factory Method 패턴을 유용하게 사용할 수 있다. 지금 소개한 이러한 구조는 MVC(Model-View-Controller)로 잘 알려져 있다.(Smalltalk나 VC++ 사용자에게는 꽤 익숙한 개념일 것이다) 또한 GUI의 다양한 요소들을 생성하기 위해 이 패턴을 사용하고 있다.