최상단 광고

2012년 4월 17일 화요일

[Chapter3] 생성 패턴 - 추상 팩토리

1. 추상 팩토리(Abstract Factory)란?
  추상 팩토리 패턴(Abstract factory pattern)은 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용합니다. 이 패턴을 사용하여 상황에 알맞은 객체를 생성할 수 있습니다.
  추상 팩토리를 통해서 제품군(객체의 집합)을 생성하기 위한 인터페이스를 제공할 수 있습니다. 인터페이스를 이용하는 코드를 만들면 코드를 제품을 생산하는 실제 팩토리와 분리 시킬 수 있습니다. 서로 다른 상황별로 적당한 제품을 생산할 수 있는 다양한 팩토리를 구현할 수 있게 됩니다.
  즉, 공통된 부분은 객체들의 동적 메모리 할당을 책임지고 관리하는 팩토리를 만들어서 확장 및 관리를 용이하게 할 수 있게 하는 패턴입니다.인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않도고 생성할 수 있습니다.


2. 추상 팩토리는 언제 사용되나?
- 여러 객체군들 중에서 특정 객체군을 선택하여 생성하고자 할 때
- 관련된 제품 객체들이 함께 사용되도록 설계되어서, 이 부분에 대한 규약이 외부에서 사용할 시에도 지켜지게 하고 싶을 때
- 객체가 생성되거나 구성/표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때


3. 추상 팩토리 패턴의 다이어그램



☆ AbstractFactory 인터페이스
: 모든 구상 팩토리에서 구현해야 하는 인터페이스입니다. 제품을 생산하기 위한 일련의 메소드들이 정의되어 있습니다.

☆ AbstractProducetA 인터페이스
: 제품군으로 각  구상 팩토리에서 필요한 제품들을 모두 만들 수 있습니다.

☆ Client
: 클라이언트를 만들 때는 추상 팩토리를 바탕으로 만듭니다. 실제 팩토리는 실행시에 결정됩니다.

☆ ConcreateFactory 1/2
: 구상 팩토리에서는 서로 다른 제품군을 구현합니다. 클라이언트에서 제품이 필요하면 이 팩토리 가운데 적당할 걸 골라서 쓰면 되기 때문에 제품 객체의 인스턴스를 직접 만들 필요가 없게됩니다.

☆ ConcreateProduct A/B
:  구체적으로 팩토리가 생성할 객체를 정의하고, AbstractProduct가 정의하는 인터페이스를 구현합니다.


§ 협력방법 §
- 일반적으로 ConcreteFactory 클래스의 인스턴스 한 개가 런타임에 만들어집니다. 이 concreate factory는 어떤 특정 구현을 갖는 제품 객체를 생성합니다. 서로 다른 제품 객체를 생성하려면 사용자는 서로 다른 concreate factory를 사용해야 합니다.
- AbstractFactory는 필요한 제품 객체르르 생성하는 책임을 ConcreateFactory 서브 클래스에 위임합니다.


4. 추상 팩초리 패턴을 쓰면....
1) 구체적인 클래스를 분리합니다.
  추상 팩토리 패턴을 쓰면 응용프로그램이 생성 할 각 객체의 클래스를 제어할 수 있습니다. 팩토리는 제품 객체를 생성하는 과정과 책임을 캡슐화한 것이기 때문에, 구체적인 구현 클래스가 사용자에게서 분리됩니다. 일반 프로그램은 추상 인터페이스를 통해서만 인스턴스를 조작합니다. 제품 클래스 이름이 구체 팩토리의 구현에 분리되므로, 사용자 코드에는 나타나지 않는 것입니다.

2) 제품군을 쉽게 대체할 수 있습니다.
  구체 팩토리의 클래스는 응용프로그램에서 한 번만 나타나기 때문에 응용프로그램이 사용할 구체 팩토리를 변경하기는 쉽습니다. 또한, 구체 팩토리를 변경함르오써 응용프로그램은 서로 다른 제품을 사용할 수 있게 변경됩니다. 추상 팩토리는 필요한 모든 것을 생성하기 때문에 전체 제품군은 한번에 변경이 가능합니다.

3) 제품 사이의 일관성을 증진시킵니다.
  하나의 군 안에 속한 제품 객체들이 함께 동작하도록 설계되어 있을 때, 응용프로그램은 한 번에 오직 한 군에서 만든 객체를 사용하도록 함으로써 프로그램은 한 번에 오직 한 군데에서 만든 객체를 사용하도록 함으로써 프로그램의 일관성을 갖도록 해야 합니다.

4) 새로운 종류의 제품을 제공하기 어렵습니다.
  새로운 종류의 제품을 만들기 위해 기존 추상 팩토리를 확장하기가 쉽지 않습니다. 생성되는 제품은 추상 팩토리가 생성할 수 있는 제품 집합에만 고정되어 있기 때문입니다. 만약 새로운 종류의 제품이 등장하면 팩토리의 구현을 변경해야 합니다. 이는 추상 팩토리와 모든 서브클래스의 변경을 가져옵니다. 즉, 인터페이스가 변경되는 새로운 제품을 생성하는 연산이 추가되거나, 기존 연산의 반환 객체 타입이 변경되었으므로, 이를 상속받는 서브클래스 모두 변경되어야 합니다.

cf) 관련패턴
: AbstractFactory 클래스는 팩토리 메서드 패턴을 이용해서 구현되는데, 원형 패턴을 이용할 때도 있습니다. 구체 팩토리는 단일체 패턴을 이용해 구현하는 경우가 많습니다.

댓글 없음: