일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- leetcode풀이
- 코틀린기초
- python 알고리즘
- 파이썬 알고리즘
- python sorted
- 릿코드풀기
- 릿코드풀이
- 잇츠디모
- 릿코드 풀기
- python xor
- python 릿코드
- python zip_longest
- 알고리즘풀이
- 파이썬알고리즘
- leetcode 풀기
- binary search
- LeetCode
- 파이썬 프로그래머스
- 알고리즘풀기
- 상가수익률계산기
- 파이썬릿코드
- python priority queue
- 릿코드
- 파이썬 알고리즘 풀기
- 파이썬 릿코드
- leetcode풀기
- 파이썬알고리즘풀기
- python Leetcode
- 파이썬릿코드풀기
- 릿코드 파이썬
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][Abstract Factory] 추상 팩토리 패턴 본문
추상 팩토리 패턴 정의
- 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용
- 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 패턴
추상 팩토리 패턴은 다양한 구성 요소 별로 객체의 집합(군)을 만들기 위한 패턴
추상 팩토리 패턴 클래스 다이어그램
ConcreteFactory1, ConcreateFactory2는 서로 다른 객체의 집합군을 생성한다. AbatractFactory를 상속 받아서 ConcreateFactoryN을 만들어서 다양한 객체의 집합군을 생성할 수 있다. 클라이언트는 복잡한 객체의 생성에 관여하지 않고 팩토리에게 객체의 생성을 맡겨서 객체 생성을 분리시킨다.
추상 팩토리 패턴 활용
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
'시스템 설계 및 디자인 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴][Bridge] 브릿지 패턴 (0) | 2022.03.25 |
---|---|
[디자인패턴][Template Method] 템플릿 메소드 패턴 (2) | 2022.03.25 |
[디자인패턴][Mediator] 중재자 패턴 (0) | 2022.03.24 |
[디자인패턴][Observer] 옵저버 패턴 (0) | 2022.03.24 |
[디자인패턴][Prototype] 프로토타입 패턴 (0) | 2022.03.24 |