Abstract Factory Pattern

IT/Design Pattern | 2009/06/18 23:47 | taegony

문제
어떻게 하면 같은 제품군에 속한 제품들의 객체만을 생성해서 사용하도록 명확히 보장받을 수 있는가?
예를들어 타입A 제품의 종류는 A1, A2가 있으며 타입B 제품의 종류는 B1, B2 가 있다.
제품 생산시 1번 제품군은 A1, B1이며 2번 제품군은 A2, B2이다.
조건에 따라 제품군으로 분류된 제품만을 생성해야 한다.

방법1
- 제품군을 생성할 때마다 조건 비교를 한다.
- 이 방법은 조건문이 곳곳에 들어가게 된다.
  추후 제품이 추가되는 경우 조건문이 들어간 부분을 모두 찾아서 수정해야한다.
  아래 코드와 같이 생성함수에서 추가된 제품의 종류를 비교해야 한다.
- 샘플
[code cpp]
class productA {};
class productB {};
class productA1 : public productA {};
class productA2 : public productA {};
class productB1 : public productB {};
class productB2 : public productB {};

void CreateProductA ()
{
  ...
  if (iType == 1) {
    productA1 pa1;
  }
  else {
    productA2 pa2;
  }
  ...
}

void CreateProductB ()
{
  ...
  if (iType == 1) {
    productB1 pb1;
  }
  else {
    productB2 pb2;
  }
  ...
}

int main ()
{
  ...
  CreateProductA ();
  CreateProductB ();
  ...
}
[/code]

방법2
- Factory Method 패턴에서 사용했던 팩토리 메소드를 가진 클래스를 제품군별로 생성한다.
- 이점
  1. 개별 제품 클래스의 객체를 생성할 때마다 일일이 조건을 검색할 필요가 없어진다.
  2. 새로운 제품군의 생성시 기존 소스코드는 건드릴 필요가 없다.
  3. 팩토리 클래스가 별도로 존재하기 때문에 클라이언트는 추상클래스의 인터페이스만 바라보면 된다.
  4. 반드시 선택된 제품군에 포함된 제품들만 생성해야하는 경우 유용하다.
- 단점
  1. 제품군이 늘어나면 어쩔 수 없이 팩토리 클래스의 수도 늘어나게 된다.
  2. 기존 제품군에 새로운 제품이 추가되면 모든 팩토리 클래스에 새로운 제품을 추가해야한다.
- 샘플
[code cpp]
class AbstractProductA {};
class AbstractProductB {};
class ProductA1 : public AbstractProductA {};
class ProductA2 : public AbstractProductA {};
class ProductB1 : public AbstractProductB {};
class ProductB2 : public AbstractProductB {};

class AbstractFactory
{
  public:
    virtual productA* CreateProductA () = 0;
    virtual productB* CreateProductB () = 0;
};

class Type1_Factory : public AbstractFactory
{
  public:
    AbstractProductA * CreateProductA () {return new ProductA1;}
    AbstractProductB * CreateProductB () {return new ProductB1;}
};

class Type2_Factory : public AbstractFactory
{
  public:
    AbstractProductA * CreateProductA () {return new ProductA2;}
    AbstractProductB * CreateProductB () {return new ProductB2;}
};

int main ()
{
  ...
  AbstractFactory *pFactory = null;

  if (iType == 1) {
    pFactory = new Type1_Factory ();
  }
  else {
    pFactory = new Type2_Factory ();
  }
 
  AbstractProductA *pProductA = pFactory->CreateProductA ();
  AbstractProductB *pProductB = pFactory->CreateProductB ();
  ...
}
[/code]

사용자 삽입 이미지

사용자 삽입 이미지


이전 1 ... 36 37 38 39 40 41 42 43 44 ... 81 다음