반응형
팩토리 패턴 개요
- 팩토리란, 다른 클래스의 객체를 생성하는 클래스를 일컫는다.
- 클라이언트는 특정 ‘인자’와 함께 ‘메서드’를 호출하고 팩토리는 해당 객체를 생성하고 반환한다.
- 직접 객체를 생성하지 않고 팩토리를 사용하는 이유
- 객체 생성과 클래스 구현을 나눠 상호 의존도를 줄이기 위함.
- 클라이언트는 인터페이스와 메소드, 인자 등의 정보만 있으면 된다.
- 코드를 수정하지 않고 팩토리에 새로운 클래스를 추가할 수 있다.
- 이미 생성된 객체를 팩토리가 재활용할 수 있다.
- 팩토리 패턴 3가지 종류
- 심플 팩토리 패턴 - 인터페이스는 객체 생성 로직을 숨기고 객체를 생성
- 팩토리 메소드 패턴 - 인터페이스를 통해 객체를 생성하지만 서브 클래스가 객체 생성에 필요한 클래스를 선택
- 추상 팩토리 패턴 - 객체 생성에 필요한 클래스를 노출하지 않고 객체 생성, 내부적으로 다른 팩토리 객체 생성
심플 팩토리 패턴
- 여러 종류의 객체를 사용자가 직접 클래스를 호출하지 않고 생성할 수 있다.
- 아래는 팩토리 패턴을 통해 원하는 객체를 생성하는 구현 코드이다.
from abc import ABCMeta, abstractmethod
class Animal(metaclass = ABCMeta):
@abstractmethod
def do_say(self):
pass
class Dog(Animal):
def do_say(self):
print("Warl Warl!!")
class Cat(Animal):
def do_say(self):
print("Meow Meow!!")
## 팩토리 클래스
# Dog, Cat 문자열이 eval를 통해 Dog, Cat 클래스를 실행한다.
class AnimalFactory(object):
def make_sound(self, object_type):
return eval(object_type)().do_say()
## 클라이언트 코드
if __name__ == '__main__':
factory = AnimalFactory()
animal = input("어떤 동물을 선택하시겠습니까? (Dog or Cat)")
factory.make_sound(animal)
"""
결과값 1.
어떤 동물을 선택하시겠습니까? (Dog or Cat)Cat
Meow Meow!!
결과값 2.
어떤 동물을 선택하시겠습니까? (Dog or Cat)Dog
Warl Warl!!
"""
*eval 함수에 대한 사용법은 아래 링크를 참고해주세요.
반응형
'나는 이렇게 본다 > 파이썬 디자인 패턴' 카테고리의 다른 글
퍼사드 패턴 (0) | 2022.05.31 |
---|---|
팩토리 메소드, 추상 팩토리 패턴 (0) | 2022.05.30 |
모노스테이트, 메타클래스, 싱글톤 구현예시 (0) | 2022.05.25 |
싱글톤 패턴, 게으른 초기화, 모듈 싱글톤 (0) | 2022.05.24 |
디자인 패턴 개요 (0) | 2022.05.23 |