작성: 한동훈(traxacun at unitel.co.kr)
Abstract Factory Pattern
Abstract Factory 패턴은 관련된 여러 인스턴스들로 구성된 클래스를 생성하기 위해 사용된다. 이러한 예로 자주 설명되는 것은 "자동차 공장"이 있다. 자동차는 다양한 부품(Part)으로 이루어진다. 페라리 자동차를 만들기 위해 페라리 프레임, 페라리 엔진을 사용하고, 폭스 바겐 자동차를 만들기 위해 폭스 바겐 프레임, 폭스 바겐 엔진을 사용한다. 페라리 엔진을 폭스 바겐 자동차를 만들기 위해 사용할 수 없을 것이다. 이처럼 한 가지에 밀접하게 연관된 클래스들의 인스턴스를 생성하기 위해 이 패턴을 사용할 수 있다. 반면에 페라리와 폭스 바겐 자동차 모두 동일한 종류의 타이어를 사용한다고 하자. 이런 경우에 타이어는 해당 자동차와 밀접하게 연관된 것은 아니지만 이런 경우에도 이 패턴에 함께 적용할 수 있다. 즉, 밀접하게 관련된 클래스와 그렇지 않은 클래스들의 모음을 생성해내기 위해 이 패턴을 사용한다.
[그림 1] Abstract Factory
여기서 Environment 클래스가 이 패턴을 이용하는 클라이언트를 나타낸다.(다른 디자인 패턴 책에는 Client로 되어 있을 것이다) Environment 클래스의 코드를 살펴보고 Tester 클래스에서 이 패턴을 어떻게 이용하는지 살펴보면 코드를 이해하기 한결 쉬울 것이다.(자세한 설명은 마찬가지로 다른 디자인 패턴 책을 참고하기 바란다)
[그림 2] Envrionment 클래스
AbstractProduct와 Product의 관계는 Simple Factory이며, CreateProduct 메서드에서 각각의 Product 클래스의 인스턴스를 생성하는 것을 알 수 있다. 즉, ConcreteFactory와 Product의 관계는 Advanced C#. 5회에서 살펴본 Factory Method와 유사하다는 것을 알 수 있을 것이다.(또한 Builder 패턴과도 비슷하다)
[그림 3] Tester 클래스
Tester 클래스에서 알 수 있는 것처럼 AbstractFactory 클래스를 통해 관련된 클래스들의 인스턴스를 한 번에 생성해내고, 이렇게 생성된 인스턴스들간에 상호작용은 Environment 클래스에서 이루어지는 것을 알 수 있다. 나머지 소스는 다음과 같다.
[그림 4] AbstractProductA 클래스
[그림 5] ProductA1 클래스
[그림 6] ProductA2 클래스
[그림 7] AbstractProductB 클래스
[그림 8] ProductB1 클래스
[그림 9] ProductB2 클래스
[그림 10] AbstractFactory 클래스
[그림 11] ConcreteFactory1 클래스
[그림 12] ConcreteFactory2 클래스
AbstractFactory는 집합체(Whole)를 구성하는 것과 관련된 클래스들의 인스턴스(Part)를 한 번에 생성하는 데 유용하다. 각 인스턴스들은 집합체와 꼭 관련된 것일 필요는 없다. AbstractFactory 역시 GUI를 구성하는 것들과 밀접한 관계를 갖고 있다. 다음은 AbstractFactory를 실제적으로 잘 설명하고 있는 예를 옮겨둔 것이다.(자세한 것은 참고자료를 보기 바란다)
TaiyoSystem.GoF.CSharp.AbstractFactory.CUI |
App |
TaiyoSystem.GoF.CSharp.AbstractFactory.ListFactory |
ListFactory |
TaiyoSystem.GoF.CSharp.AbstractFactory.ListFactory |
ListLink |
TaiyoSystem.GoF.CSharp.AbstractFactory.ListFactory |
ListTray |
TaiyoSystem.GoF.CSharp.AbstractFactory.ListFactory |
ListPage |
TaiyoSystem.GoF.CSharp.AbstractFactory.TableFactory |
TableFactory |
TaiyoSystem.GoF.CSharp.AbstractFactory.TableFactory |
TableLink |
TaiyoSystem.GoF.CSharp.AbstractFactory.TableFactory |
TableTray |
TaiyoSystem.GoF.CSharp.AbstractFactory.TableFactory |
TablePage |
이 예제에서는 하나의 응용 프로그램(App)에서 사용하는 리스트(List)와 테이블(Table)이 있으며 이들 각각이 서로 관련되어 있다는 것을 알 수 있다. 이와 같이 Abstract Factory 패턴은 서로 관련된 클래스들의 인스턴스를 생성하는 데 유용하게 사용할 수 있다.
참고자료