오르카의 아틀리에


Template Method 패턴에서 부모 클래스에서 알고리즘의 레이아웃을 정하고 자식 클래스에서 구체적인 구현을 하였다. Template Method 인스턴스 생성에 적용한 패턴이 바로 Factory Method 패턴이다. 이전에 Template Method 패턴과 연계하여 공부하면 좀 더 빠르게 이해할 수 있을 것이다.

어디에 사용되나?

목적과 의도를 먼저 말하자면, Template Method와 비슷하다. Template Methode에서 어떤 알고리즘의 레이아웃을 정하고 자식 클래스에서 구체적인 구현을 하였다면, Factory Method는 부모 클래스에서 객체가 어떻게 생성되는지 구체적인 레이아웃을 잡고 자식클래스에서 구체적으로 구현하는 방법이다. 주로 인스턴스 생성 시퀸스가 비슷하면서 복잡한 클래스들의 생성을 다룰 때 사용한다.

UML


UML을 살펴보면 추상 Creator가 Product를 만들고 있고 그것을 상속받은 ConcreteCreator가 ConcreteProduct를 만들어 내고 있다. Creator라는 대행자를 통해 factoryMethod를 통하여 구체적인 Product를 생산해내는 모양을 하고 있다.


Template method와 비교했을 때 부모 클래스인 Creator와 Product에서 대략적인 레이아웃만 잡아주고, 자식 클래스인 ConcreteCreator와 ConcreteProduct에서 구체적인 내용을 구현하게 된다. Template Method와 비슷한 의도를 가지고 비슷한 역할들을 만든 것이기 때문에 더 자세한 설명은 생략하고 바로 소스코드를 보도록 하자.

소스 코드

사실 그렇게 좋지 못한 소스코드이다. 오랜만에 C++를 이용하려다보니 문법도 되게 어색하고, 깐깐한 느낌이다. (덕분에 잘 구현하지못한부분 ㅠㅠ 애써 변명중...)



간단하게 살펴보면 UML 처럼 구성되어있는데, 몬스터 발생기를 만들어 보았다. MonsterGenerator는 Factory, Monster는 Product이고 각각 AntMan과 Wasp에 대해 Concrete Factory와 Concrete Product를 만들었다.


그런데 사실 지금은 AntMan과 Wasp 이렇게 둘밖에 없어서 총 6개의 클래스가 있지만 몬스터가 N개가 되면 클래스가 2*N+2개로 증가한다. 사실 ConcreteFactory는 ConcreteProduct를 생성하는 역할이기 때문에 클래스의 내용이 크게 달라지지 않는다. 이럴 때 Template를 이용하면 클래스의 개수를 줄일 수 있다.



Template를 사용하여 모든 ConcreteFactory를 하나로 줄였다. 이렇게 몬스터가 N 마리 정의되어있을 때 클래스는 N+3이 된다. (물론 소스코드 상에서……. 실제로는 사용될 때 새로 만들어 질 거다) 사실 Template을 잘만 사용하면 소스코드의 길이를 크게 줄일 수 있다