(C++ : Design-pattern) Factory Method

Posted by : at

Category : Cpp   Design-pattern


Factory Method 의도

  • 객체를 생성하기 위해 인터페이스를 정의 하지만, 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브 클래스가 한다.
  • Factory Method 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브클래스로 미룬다.
  • template method와 유사한 형태이다
struct IEdit
{
    virtual void Draw() = 0;
    virtual ~IEdit() {}
};

struct IButton
{
    virtual void Draw() = 0;
    virtual ~IButton() {}
};

struct WinButton : public IButton { void Draw() { cout << "Draw WinButton" << endl; }};
struct GTKButton : public IButton { void Draw() { cout << "Draw GTKButton" << endl; }};

struct WinEdit : public IEdit { void Draw() { cout << "Draw WinEdit" << endl; }};
struct GTKEdit : public IEdit { void Draw() { cout << "Draw GTKEdit" << endl; }};

class WinDialog
{
public:
    void Init()
    {
        WinButton* pBtn = new WinButton;
        WinEdit* pEdit = new WinEdit;

        pBtn->Draw();
        pEdit->Draw();
    }
};

class GTKDialog
{
public:
    void Init()
    {
        GTKButton* pBtn = new GTKButton;
        GTKEdit* pEdit = new GTKEdit;

        pBtn->Draw();
        pEdit->Draw();
    }
};
// 공통된 부분을 기반클래스로 뽑아보자.


int main(int argv, char** argc)
{
    WinDialog dlg;
    dlg.Init();
}
class BaseDialog
{
public:
    void Init()
    {
        IButton* pBtn = CreateButton();
        IEdit* pEdit = CreateEdit();

        pBtn->Draw();
        pEdit->Draw();
    }
    virtual IButton* CreateButton() = 0;
    virtual IEdit* CreateEdit() = 0;
};

class WinDialog : public BaseDialog
{
public:
    virtual IButton* CreateButton() { return new WinButton; }
    virtual IEdit* CreateEdit() { return new WinEdit; }
};

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links