티스토리 뷰

개발/디자인 패턴

Abstract Factory 패턴

-=HaeJuK=- 2024. 3. 5. 20:40
반응형

Abstract Factory 패턴은 생성 패턴(Creational Pattern)의 하나로, 서로 관련있거나 의존하는 객체들의 그룹을 생성하기 위한 인터페이스를 제공하면서, 구체적인 클래스를 지정하지 않는 디자인 패턴입니다. 이 패턴의 목적은 클라이언트 코드가 생성할 객체의 구체적인 타입과 분리되도록 하는 것입니다. 이를 통해 클라이언트 코드의 유연성과 재사용성을 높일 수 있습니다.

Abstract Factory 패턴의 구성 요소

  1. Abstract Factory: 추상 팩토리는 구체 팩토리가 구현해야 하는 인터페이스를 정의합니다. 이 인터페이스는 다양한 타입의 추상 제품을 생성하는 메소드를 선언합니다.
  2. Concrete Factory: 구체 팩토리는 추상 팩토리 인터페이스를 구현하는 클래스로, 특정 제품 패밀리를 생성하는 메소드를 구현합니다.
  3. Abstract Product: 추상 제품은 팩토리가 생성하는 제품의 인터페이스를 정의합니다.
  4. Concrete Product: 구체 제품은 추상 제품 인터페이스를 구현하는 클래스로, 구체 팩토리가 생성하는 제품을 나타냅니다.
  5. Client: 클라이언트는 추상 팩토리와 추상 제품 인터페이스만을 사용하여 제품을 생성하고 사용합니다.
  6.  

예제: GUI 라이브러리

GUI 애플리케이션을 개발할 때, 다양한 운영 체제에서 실행되도록 여러 종류의 GUI 요소(버튼, 체크박스 등)를 제공해야 할 수 있습니다. Abstract Factory 패턴을 사용하여 이 문제를 해결할 수 있습니다.

AbstractFactory 인터페이스와 ConcreteFactory 클래스

class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual Checkbox* createCheckbox() = 0;
    virtual ~GUIFactory() {}
};

class WinFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new WinButton();
    }
    Checkbox* createCheckbox() override {
        return new WinCheckbox();
    }
};

class LinuxFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new LinuxButton();
    }
    Checkbox* createCheckbox() override {
        return new LinuxCheckbox();
    }
};​

 

AbstractProduct 인터페이스와 ConcreteProduct 클래스

class Button {
public:
    virtual void paint() = 0;
    virtual ~Button() {}
};

class WinButton : public Button {
public:
    void paint() override {
        cout << "Windows Button\n";
    }
};

class LinuxButton : public Button {
public:
    void paint() override {
        cout << "Linux Button\n";
    }
};

class Checkbox {
public:
    virtual void paint() = 0;
    virtual ~Checkbox() {}
};

class WinCheckbox : public Checkbox {
public:
    void paint() override {
        cout << "Windows Checkbox\n";
    }
};

class LinuxCheckbox : public Checkbox {
public:
    void paint() override {
        cout << "Linux Checkbox\n";
    }
};

 

클라이언트 코드

int main() {
    GUIFactory* factory;
    Button* button;
    Checkbox* checkbox;

    // 운영 체제에 따라 적절한 팩토리 인스턴스를 선택
    if (runningOnWindows()) {
        factory = new WinFactory();
    } else {
        factory = new LinuxFactory();
    }

    // 팩토리를 사용하여 GUI 요소 생성
    button = factory->createButton();
    checkbox = factory->createCheckbox();

    // GUI 요소 사용
    button->paint();
    checkbox->paint();

    // 메모리 정리
    delete button;
    delete checkbox;
    delete factory;

    return 0;
}

 

이 예제에서는 Abstract Factory 패턴을 사용하여 다양한 운영 체제에 대응하는 GUI 요소를 유연하게 생성할 수 있습니다. 클라이언트 코드는 생성되는 객체의 구체적인 클래스에 대해 알 필요가 없으며, 새로운 요소나 요소 패밀리를 추가하려면 추상 및 구체 팩토리, 제품 인터페이스 및 클래스만 수정하면 됩니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함