팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 정의하고 어떤 클래스의 인스턴스를 생성할 지는 서브 클래스에서 결정합니다.
서브 클래스에서 오버라이드 된 메서드를 통해서 객체 생성 작업을 서브클래스에 캡슐화 시킬 수 있어서 클라이언트와 서브 클래스의 코드를 분리해서 유지 보수나 코드 수정에 유용합니다.
class PizzaStore
{
public:
PizzaStore() {}
virtual ~PizzaStore() {}
virtual Pizza* createPizza( int number ) = 0;
virtual Pizza* orderPizza( int number )
{
Pizza* pizza;
pizza = createPizza( number );
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
};
class ChicagoPizzaStore : public PizzaStore
{
public:
ChicagoPizzaStore()
{
cout<<"시카고 피자 가계 오픈"<<endl;
}
~ChicagoPizzaStore()
{
cout<<"시카고 피자 가계 닫음"<<endl;
}
Pizza* createPizza( int number ) override
{
Pizza* object = NULL;
switch( number )
{
case 1: /// 페퍼로니 피자
object = new ChicagoPepperoniPizza();
break;
case 2: /// 치킨 피자
object = new ChickenPizza();
break;
default:
return object;
}
return object;
}
};
class NewYorkPizzaStore : public PizzaStore
{
public:
NewYorkPizzaStore()
{
cout<<"뉴욕 피자 가계 오픈"<<endl;
}
~NewYorkPizzaStore()
{
cout<<"뉴욕 피자 가계 닫음"<<endl;
}
Pizza* createPizza( int number ) override
{
Pizza* object = NULL;
switch( number )
{
case 1: /// 페퍼로니 피자
object = new PepperoniPizza();
break;
case 2: /// 치킨 피자
object = new ChickenPizza();
break;
default:
return object;
}
return object;
}
};
Pizza 클래스는 전 글의 심플 팩토리 패턴에서의 클래스와 동일합니다.
PizzaStore라는 클래스를 상위 클래스로 만들고 시카고 피자를 만드는 ChicagoPizzaStore, 뉴욕 피자를 만드는 NewYorkPizzaStore라는 클래스들은 PizzaStore 클래스를 상속 받습니다.
createPizza 메서드는 순수 가상 함수이기 때문에 각 하위 클래스인 시카코, 뉴욕 클래스 안에서 반드시 정의를 해주어야 합니다. 이로써 하위 클래스들이 각 객체의 생성을 담당하는 팩토리가 된 것입니다.
앞으로는 또 다른 종류의 가계가 늘어 난다고 해도 복잡한 과정이 필요 없이 서브 클래스만 추가 하여 주면 됩니다.
*팩토리 메소드 패턴은 하나의 객체 안에서 수많은 다른 객체들이 동적으로 생성되거나, 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을때 사용하면 유용합니다.
'기타' 카테고리의 다른 글
[Windows] 윈도우 10 - 원격 데스크톱 연결 사용 (0) | 2023.05.21 |
---|---|
추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2016.10.19 |
심플 팩토리 패턴 (Simple Factory Pattern) (0) | 2016.10.13 |
옵져버(Observer) 패턴 (1) | 2016.10.13 |
winsock i/o 모델 종류.. (0) | 2016.10.10 |