[디자인패턴] 생성패턴(3) - Abstract Factory Pattern (추상 팩토리 패턴)

Study/Software Architecture · 2023. 5. 18. 00:39

디자인 패턴 총정리 시리즈의 세 번째 패턴은 Abstract Factory Method Pattern입니다.

Factory Method Pattern과 함께 응용하여 사용할 수 있는 패턴입니다.

1. 개요

Abstract Factory Method 패턴은 관련되거나 의존된 객체 집합을 생성하기 위한 인터페이스를 제공하는 패턴입니다. 구체적인 클래스는 지정하지 않고, 개체 생성 절차를 캡슐화함으로써 클라이언트는 인스턴스화된 특정 클래스를 몰라도 개체를 만들 수 있습니다. 해당 패턴을 통해 클라이언트 코드와 클라이언트 코드가 생성하는 객체 간의 결합을 느슨하게 만들어 유연성과 유지보수성을 향상할 수 있습니다.

 

2. 예시 - UI Factory

윈도우, 맥, 리눅스 등 여러 플랫폼을 지원하는 게임 개발 시나리오를 생각해 보겠습니다.

해당 게임은 클라인트 코드를 구체적인 UI 클래스와 깊이 결합하지 않고, 버튼이나 체크박스와 같은 플랫폼 고유의 사용자 인터페이스를 만들고 싶습니다.

 

이를 위해 Abstract Factory Method 패턴을 이용해보겠습니다.

먼저 Abstract Factory 인터페이스를 정의하고 UI 인터페이스 작성 방법을 선언합니다.

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

그다음 Abstract Factory 인터페이스를 준수하면서 각 플랫폼에 대한 concrete factory를 구현합니다.

class WindowsUIFactory : public UIAbstractFactory {
public:
    Button* createButton() override {
        return new WindowsButton();
    }

    Checkbox* createCheckbox() override {
        return new WindowsCheckbox();
    }
};

class MacOSUIFactory : public UIAbstractFactory {
public:
    Button* createButton() override {
        return new MacOSButton();
    }

    Checkbox* createCheckbox() override {
        return new MacOSCheckbox();
    }
};

또한, 추상적인 UI 요소들과 각 플랫폼에 대한 구체적인 고유 인터페이스도 정의합니다.

현재 클라이언트 코드는 Abstract Factory를 사용해서 Concrete Class에 얽매이지 않고, 플랫폼 고유 인터페이스를 만들 수 있습니다

void createUI(UIAbstractFactory* factory) {
    Button* button = factory->createButton();
    Checkbox* checkbox = factory->createCheckbox();

    // Use the created UI elements
    // ...
}

적절한 Concrete Factory(WindowsUIFacotry, MacOSUIFactory 등)을 createUI 메서드에 전달함으로써 클라이언트 코드는 원하는 플랫폼용 UI 인터페이스를 원활하게 구현할 수 있습니다.

 

3. 장점

1) Encapsulation: 해당 패턴은 factory 내 객체 생성 절차를 캡슐화하고 클라이언트 코드와 concrete 클래스 사이를 깨끗하게 분리할 수 있게 합니다.

2) Flexibility: 해당 패턴은 Abstract Factory를 확장하고, 새로운 concrete factory를 구현함으로써 새로운 유형의 객체와 객체의 구성을 쉽게 추가할 수 있다.

3) Testability: 해당 패턴은 concrete factory를 모의 구현으로 대체함으로써 단위 테스트를 용이하게 하고 테스트를 위한 컴포넌트 분리를 돕습니다.

 

4. 단점

1) Complexity: Abstract Factory Method 패턴을 구현하기 위해서, abstract 클래스 및 여러 concrete 클래스를 정의해야 하므로 코드가 복잡해질 수 있습니다.

2) Incresed code size: 해당 패턴은 넓은 범위의 객체와 그 객체의 다양성을 다룰 때 코드 베이스 크기가 과해질 수 있습니다.

5. 결론

Abstract Factory Method 패턴은 객체 생성을 분리하고 소프트웨어의 유연성을 향상할 수 있는 구조를 제공합니다. Abstract Factory 내 관련 객체 작성을 캡슐화함으로써 클라이언트는 구체적인 구현에 얽매이지 않고 객체를 생성할 수 있습니다. 이를 통해 코드의 유지보수성, 테스트성 및 확장성을 향상할 수 있습니다.

 

반응형