728x90

팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 정의하고 어떤 클래스의 인스턴스를 생성할 지는 서브 클래스에서 결정합니다.

 

서브 클래스에서 오버라이드 된 메서드를 통해서 객체 생성 작업을 서브클래스에 캡슐화 시킬 수 있어서 클라이언트와 서브 클래스의 코드를 분리해서 유지 보수나 코드 수정에 유용합니다.

 

 

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 메서드는 순수 가상 함수이기 때문에 각 하위 클래스인 시카코, 뉴욕 클래스 안에서 반드시 정의를 해주어야 합니다. 이로써 하위 클래스들이 각 객체의 생성을 담당하는 팩토리가 된 것입니다.

 

앞으로는 또 다른 종류의 가계가 늘어 난다고 해도 복잡한 과정이 필요 없이 서브 클래스만 추가 하여 주면 됩니다.

 

*팩토리 메소드 패턴은 하나의 객체 안에서 수많은 다른 객체들이 동적으로 생성되거나, 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을때 사용하면 유용합니다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침