소프트웨어에 대한 모든 것

[디자인패턴][Abstract Factory] 추상 팩토리 패턴 본문

시스템 설계 및 디자인/디자인 패턴

[디자인패턴][Abstract Factory] 추상 팩토리 패턴

앤테바 2022. 3. 25. 10:03
반응형

추상 팩토리 패턴 정의

  • 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용
  • 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 패턴

 

추상 팩토리 패턴은 다양한 구성 요소 별로 객체의 집합(군)을 만들기 위한 패턴

 

추상 팩토리 패턴 클래스 다이어그램

ConcreteFactory1, ConcreateFactory2는 서로 다른 객체의 집합군을 생성한다. AbatractFactory를 상속 받아서 ConcreateFactoryN을 만들어서 다양한 객체의 집합군을 생성할 수 있다. 클라이언트는 복잡한 객체의 생성에 관여하지 않고 팩토리에게 객체의 생성을 맡겨서 객체 생성을 분리시킨다.

Abstract Factory 패턴 Class Diagram

추상 팩토리 패턴 활용

Browser, Messenger 제품이 있고, 해당 제품에 일반 제품과 보안이 적용된 제품이 있습니다. 일반 제품군을 생산하는 팩토리, 보안이 적용된 제품군을 생산하는 팩토리. 이를 추상 팩토리 패턴을 적용해 보겠습니다.

(Abstract Factory Design Pattern in Python 참고)

 

예제 코드가 좀 길어서 Product 부분과 Factory 부분을 나누었습니다.

 

Product 코드

  • Browser, Messenger 추상 클래스
  • Browser를 상속 받은 일반 VanillaBrowser와 보안이 적용된 SecureBrowser
  • Messenger를 상속 받은 일반 VanillaMessenger와 보안이 적용된 SecureMessenger
class Browser(ABC):
    @abstractmethod
    def create_search_toolbar(self):
        pass

    @abstractmethod
    def create_browser_window(self):
        pass


class Messenger(ABC):
    @abstractmethod
    def create_messenger_window(self):
        pass


class VanillaBrowser(Browser):
    def create_search_toolbar(self):
        print('Vanilla Search Toolbar Created')

    def create_browser_window(self):
        print('Vanilla Browser Window Created')


class VanillaMessenger(Messenger):
    def create_messenger_window(self):
        print('Vanilla Messenger Window Created')


class SecureBrowser(Browser):
    def create_search_toolbar(self):
        print('Secure Search Toolbar Created')

    def create_browser_window(self):
        print('Secure Browser Window Created')


class SecureMessenger(Messenger):
    def create_messenger_window(self):
        print('Secure Messenger Window Created')

Factory 코드

  • AbstractFactory는 추상 클래스. 브라우저 생성, 메신저 생성 추상 함수가 있습니다.
  • VanillaProductsFactory: 바닐라 제품군 생산 공장
  • SecureProductsFactory: 보안 제품군 생산 공장
class AbstractFactory(ABC):
    @abstractmethod
    def create_browser(self):
        pass

    @abstractmethod
    def create_messenger(self):
        pass


class VanillaProductsFactory(AbstractFactory):
    def create_browser(self):
        return VanillaBrowser()

    def create_messenger(self):
        return VanillaMessenger()


class SecureProductsFactory(AbstractFactory):
    def create_browser(self):
        return SecureBrowser()

    def create_messenger(self):
        return SecureMessenger()

Client 코드

# Vanilla 제품군
vanilla_product = VanillaProductsFactory()
vanilla_browser = vanilla_product.create_browser()
vanilla_messenger = vanilla_product.create_messenger()
vanilla_browser.create_browser_window()
vanilla_browser.create_search_toolbar()
vanilla_messenger.create_messenger_window()

# Secure 제품군
secure_product = SecureProductsFactory()
secure_browser = secure_product.create_browser()
secure_messenger = secure_product.create_messenger()
secure_browser.create_browser_window()
secure_browser.create_search_toolbar()
secure_messenger.create_messenger_window()

출력

Vanilla Browser Window Created
Vanilla Search Toolbar Created
Vanilla Messenger Window Created
Secure Browser Window Created
Secure Search Toolbar Created
Secure Messenger Window Created

추상 팩토리 패턴 vs 팩토리 메소드 패턴 차이

  • 팩토리 메소드는 one product를 생성할 때 사용하고 추상 팩토리는 관련된 제품군들을 생성할 때 사용

 

함께 보면 좋은 글

2022.03.24 - [시스템 설계 및 디자인/디자인 패턴] - [디자인패턴][Factory Method] 팩토리 메소드 패턴

2022.03.25 - [시스템 설계 및 디자인/디자인 패턴] - [디자인패턴][Template Method] 템플릿 메소드 패턴

 

참고 자료

https://stackabuse.com/abstract-factory-design-pattern-in-python/

https://im-yeobi.io/posts/design-pattern/factory-pattern-2/

https://kscory.com/dev/design-pattern/abstract_factory

 

 

 

반응형
Comments