
디자인 패턴 중 Abstract Factory 패턴에 대해 설명합니다.
개념
Abstract Factory 패턴은 같은 제품군에 속하는 연관된 객체들을 생성하는 생성 패턴입니다. 한마디로 N개의 Factory Method가 모여있는 Factory 클래스입니다. 다음과 같은 장점이 있습니다.
- 특정 제품군에 해당하는 객체의 생성을 보장할 수 있습니다.
- Single Responsibility Principle: 객체 생성에 대한 책임을 분리하여 비즈니스 로직의 과도한 책임을 분산합니다.
- Dependency Inversion Principle: 구체적인 구현 객체에 의존하지 않고 인터페이스에 의존합니다.
- Open-Closed Principle: 객체 생성자 호출을 비즈니스 로직과 분리하여 객체의 타입이 늘어나도 비즈니스 로직이 수정될 필요가 없습니다. 클래스 확장을 통해 해결합니다.
자세히 살펴보겠습니다.

Product
제품군에 포함될 제품을 인터페이스로 정의하여 인터페이스에 맞게 구현합니다. 구현된 제품은 Factory를 통해 생성될 것입니다.
Factory
각 제품군에 맞는 제품들을 생성할 수 있는 Factory입니다. N개의 Factory Method가 존재하는 클래스입니다. 인터페이스를 정의하여 필요한 Factory Method가 구현될 수 있도록 합니다.
Client
Factory를 사용하는 클라이언트 코드입니다. AbstractFactory에 의존하기 때문에 구체적인 구현에도 의존하지 않고 모두 같은 방식으로 다루게 됩니다. 어떤 Factory를 선택할지 외부에서 결정하여 의존성 주입한다면 Client는 어떤 Factory인지 관심을 가질 필요가 없습니다.
적용예시
GUI 프로그램을 개발 중이라고 가정합니다.

Button과 Checkbox 등 UI컴포넌트들을 사용하여 GUI를 개발하는 도중 테마에 대한 요구사항이 추가되었습니다. 그래서 N개의 테마를 추가하여 각 테마에 맞는 UI컴포넌트를 화면에 표현해야 합니다. Abstract Factory 패턴을 적용하면 특정 테마에 맞는 UI컴포넌트 생성을 보장할 수 있습니다.

class Button: ...
class ButtonA(Button): ...
class ButtonB(Button): ...
class Checkbox: ...
class CheckboxA(Checkbox): ...
class CheckboxB(Checkbox): ...
class GUITheme(abc.ABC):
@abc.abstractmethod
def create_button(self) -> Button:
return Button()
@abc.abstractmethod
def create_checkbox(self) -> Checkbox:
return Checkbox()
class GUIThemeA(GUITheme):
def create_button(self) -> Button:
return ButtonA()
def create_checkbox(self) -> Checkbox:
return CheckboxA()
class GUIThemeB(GUITheme):
def create_button(self) -> Button:
return ButtonB()
def create_checkbox(self) -> Checkbox:
return CheckboxB()
각 UI컴포넌트를 인터페이스로 정의하여 테마별 UI컴포넌트를 구현합니다. 그리고 GUITheme 인터페이스를 구현한 Factory로 각 테마에 맞는 UI컴포넌트를 생성할 수 있도록 합니다.
참조
'객체 지향 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - Adapter (0) | 2023.10.12 |
---|---|
디자인 패턴 - Singleton (0) | 2023.10.11 |
디자인 패턴 - Prototype (0) | 2023.10.09 |
디자인 패턴 - Builder (0) | 2023.10.09 |
디자인 패턴 - Factory Method (0) | 2023.10.03 |

디자인 패턴 중 Abstract Factory 패턴에 대해 설명합니다.
개념
Abstract Factory 패턴은 같은 제품군에 속하는 연관된 객체들을 생성하는 생성 패턴입니다. 한마디로 N개의 Factory Method가 모여있는 Factory 클래스입니다. 다음과 같은 장점이 있습니다.
- 특정 제품군에 해당하는 객체의 생성을 보장할 수 있습니다.
- Single Responsibility Principle: 객체 생성에 대한 책임을 분리하여 비즈니스 로직의 과도한 책임을 분산합니다.
- Dependency Inversion Principle: 구체적인 구현 객체에 의존하지 않고 인터페이스에 의존합니다.
- Open-Closed Principle: 객체 생성자 호출을 비즈니스 로직과 분리하여 객체의 타입이 늘어나도 비즈니스 로직이 수정될 필요가 없습니다. 클래스 확장을 통해 해결합니다.
자세히 살펴보겠습니다.

Product
제품군에 포함될 제품을 인터페이스로 정의하여 인터페이스에 맞게 구현합니다. 구현된 제품은 Factory를 통해 생성될 것입니다.
Factory
각 제품군에 맞는 제품들을 생성할 수 있는 Factory입니다. N개의 Factory Method가 존재하는 클래스입니다. 인터페이스를 정의하여 필요한 Factory Method가 구현될 수 있도록 합니다.
Client
Factory를 사용하는 클라이언트 코드입니다. AbstractFactory에 의존하기 때문에 구체적인 구현에도 의존하지 않고 모두 같은 방식으로 다루게 됩니다. 어떤 Factory를 선택할지 외부에서 결정하여 의존성 주입한다면 Client는 어떤 Factory인지 관심을 가질 필요가 없습니다.
적용예시
GUI 프로그램을 개발 중이라고 가정합니다.

Button과 Checkbox 등 UI컴포넌트들을 사용하여 GUI를 개발하는 도중 테마에 대한 요구사항이 추가되었습니다. 그래서 N개의 테마를 추가하여 각 테마에 맞는 UI컴포넌트를 화면에 표현해야 합니다. Abstract Factory 패턴을 적용하면 특정 테마에 맞는 UI컴포넌트 생성을 보장할 수 있습니다.

class Button: ...
class ButtonA(Button): ...
class ButtonB(Button): ...
class Checkbox: ...
class CheckboxA(Checkbox): ...
class CheckboxB(Checkbox): ...
class GUITheme(abc.ABC):
@abc.abstractmethod
def create_button(self) -> Button:
return Button()
@abc.abstractmethod
def create_checkbox(self) -> Checkbox:
return Checkbox()
class GUIThemeA(GUITheme):
def create_button(self) -> Button:
return ButtonA()
def create_checkbox(self) -> Checkbox:
return CheckboxA()
class GUIThemeB(GUITheme):
def create_button(self) -> Button:
return ButtonB()
def create_checkbox(self) -> Checkbox:
return CheckboxB()
각 UI컴포넌트를 인터페이스로 정의하여 테마별 UI컴포넌트를 구현합니다. 그리고 GUITheme 인터페이스를 구현한 Factory로 각 테마에 맞는 UI컴포넌트를 생성할 수 있도록 합니다.
참조
'객체 지향 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - Adapter (0) | 2023.10.12 |
---|---|
디자인 패턴 - Singleton (0) | 2023.10.11 |
디자인 패턴 - Prototype (0) | 2023.10.09 |
디자인 패턴 - Builder (0) | 2023.10.09 |
디자인 패턴 - Factory Method (0) | 2023.10.03 |