디자인패턴 -Abstract Factory

code_able·5일 전
0

Abstract Factory 패턴이란

추상화 팩토리 패턴(Abstract Factory Pattern)은 관련된 객체들을 그룹으로 묶어 일관된 방식으로 생성할 수 있도록 하는 디자인 패턴입니다. 여러 종류의 객체를 묶어서 생성할 때 유용하며, 객체의 구체적인 클래스가 아닌 추상적인 인터페이스에 의존하게 하여 유연성을 높입니다.

추상화 팩토리 패턴의 구조

  • AbstractFactory (추상 팩토리): 관련 객체들을 생성하는 메서드들을 선언하는 인터페이스입니다.
  • ConcreteFactory (구체 팩토리): AbstractFactory를 구현하여 특정 제품군을 생성하는 메서드를 제공합니다.
  • AbstractProduct (추상 제품): 생성될 제품의 인터페이스를 정의합니다.
  • ConcreteProduct (구체 제품): AbstractProduct를 구현한 실제 제품 클래스입니다.
  • Client (클라이언트): AbstractFactory와 AbstractProduct를 사용하여 구체적인 객체 생성에 대해 알 필요 없이 객체들을 사용합니다.

장점

  • 일관성: 관련 있는 객체들을 일관성 있게 생성할 수 있습니다.
  • 확장성: 새로운 제품군을 추가할 때 ConcreteFactory만 추가하면 되므로 코드 확장이 용이합니다.
  • 의존성 감소: 클라이언트는 구체 클래스가 아닌 추상 인터페이스에 의존하므로 구체적인 제품 변경이 클라이언트에 영향을 주지 않습니다.

예제 코드

from abc import ABC, abstractmethod

# 1. Abstract Products 정의
class Button(ABC):
    @abstractmethod
    def click(self) -> str:
        pass

class Checkbox(ABC):
    @abstractmethod
    def check(self) -> str:
        pass

# 2. Concrete Products 정의
class MacButton(Button):
    def click(self) -> str:
        return "Clicking a Mac-styled Button"

class WindowsButton(Button):
    def click(self) -> str:
        return "Clicking a Windows-styled Button"

class MacCheckbox(Checkbox):
    def check(self) -> str:
        return "Checking a Mac-styled Checkbox"

class WindowsCheckbox(Checkbox):
    def check(self) -> str:
        return "Checking a Windows-styled Checkbox"

# 3. Abstract Factory 정의
class GUIFactory(ABC):
    @abstractmethod
    def create_button(self) -> Button:
        pass

    @abstractmethod
    def create_checkbox(self) -> Checkbox:
        pass

# 4. Concrete Factories 정의
class MacFactory(GUIFactory):
    def create_button(self) -> Button:
        return MacButton()

    def create_checkbox(self) -> Checkbox:
        return MacCheckbox()

class WindowsFactory(GUIFactory):
    def create_button(self) -> Button:
        return WindowsButton()

    def create_checkbox(self) -> Checkbox:
        return WindowsCheckbox()

# 5. Client 코드
def create_ui(factory: GUIFactory):
    button = factory.create_button()
    checkbox = factory.create_checkbox()
    print(button.click())
    print(checkbox.check())

# 팩토리 선택에 따라 Mac 또는 Windows 스타일의 UI 생성
if __name__ == "__main__":
    os_type = "Mac"  # 혹은 "Windows"
    
    if os_type == "Mac":
        factory = MacFactory()
    elif os_type == "Windows":
        factory = WindowsFactory()
    else:
        raise ValueError("Unknown OS type")

    create_ui(factory)
    # 출력 예시:
    # Clicking a Mac-styled Button
    # Checking a Mac-styled Checkbox
profile
할수 있다! code able
post-custom-banner

0개의 댓글