문제
팩토리 패턴에는 크게 세 가지 종류가 있다.
심플 팩토리(Simple Factory), 팩토리 메소드(Factory Method), 추상 팩토리(Abstract Factory) 패턴이있다.
그 중 먼저 심플 팩토리에 대해 알아보자.
심플 팩토리는 간단하게 말해서 인스턴스를 생성하는 클래스를 따로 만드는 패턴이다.

from abc import *
class MyClass(ABC):
@abstractmethod
def func(self): pass
class ClassA(MyClass):
def func(self):
print("A")
class ClassB(MyClass):
def func(self):
print('B')
class Factory():
def build(self, type:str) -> MyClass:
if type == "A": return ClassA()
if type == "B": return ClassB()
raise AssertionError("type not found")위 코드와 같이 심플 팩토리는 Factory 클래스에서 인스턴스를 만들어 제공한다.
즉, 팩토리가 객체 생성 역할을 담당하여 클라이언트에서 구현 클래스에 직접 의존하지 않고 분리되어 있다.
하지만 새로운 클래스가 추가된다면 Factory 클래스를 수정해야 한다는 한계가 있기에 기존 코드의 변경 없이 확장하기 위한 팩토리 메소드 패턴이 등장한다.
팩토리 메소드 패턴에서는 인스턴스 생성을 서브 클래스에게 위임한다.
이를 통하여 새로운 클래스가 추가되어도 기존 Factory 코드의 수정이 필요 없게 된다.

from abc import *
class MyClass(ABC):
@abstractmethod
def func(self): pass
class ClassA(MyClass):
def func(self):
print("A")
class Classa(MyClass):
def func(self):
print("a")
class ClassB(MyClass):
def func(self):
print('B')
class Classb(MyClass):
def func(self):
print('b')
class Factory(ABC):
@abstractmethod
def build_upper(self) -> MyClass: pass
@abstractmethod
def build_lower(self) -> MyClass: pass
class FactoryA(Factory):
def build_upper(self) -> MyClass:
return ClassA()
def build_lower(self) -> MyClass:
return Classa()
class FactoryB(Factory):
def build_upper(self) -> MyClass:
return ClassB()
def build_lower(self) -> MyClass:
return Classb()
inp = input('Factory type: ').strip()
uplow = 'lower' if inp.islower() else 'upper'
object = eval(f"Factory{inp.upper()}().build_{uplow}()")
object.func()예제 #1
11
예제 #2
120
힌트
출처
klee