팩토리: 만드는 책임을 분리하기
보고서를 내보내는 절차는 같지만, 출력 형식은 텍스트 또는 다른 형식으로 달라질 수 있습니다. 팩토리 메서드는 객체를 만드는 단계를 하위 클래스에서 바꿀 수 있도록 합니다.
공통 절차에서 생성 메서드를 부릅니다
class TextExporter:
def render(self, text):
return "TEXT: " + text
class ExportJob:
def create_exporter(self):
raise NotImplementedError
def run(self, text):
return self.create_exporter().render(text)
class TextExportJob(ExportJob):
def create_exporter(self):
return TextExporter()
print(TextExportJob().run("weekly report"))
출력은 TEXT: weekly report입니다. ExportJob은 렌더링 절차를 담당하고, TextExportJob은 어떤 내보내기 객체를 만들지 정합니다. 새로운 하위 클래스는 create_exporter를 바꾸어 다른 객체를 제공할 수 있습니다.
비슷한 이름을 구분합니다
- 단순 팩토리: 문자열이나 조건에 따라 객체를 골라 만드는 함수입니다. 유용하지만 모든 생성 함수를 팩토리 메서드 패턴이라고 부르지는 않습니다.
- 팩토리 메서드: 공통 절차가 호출하는 생성 지점을 하위 클래스에서 바꿉니다.
- 추상 팩토리: 서로 맞아야 하는 여러 객체를 한 가족으로 만듭니다. 예를 들어 같은 테마의 버튼과 입력 상자를 함께 제공합니다.
Python에서는 생성 함수를 인자로 전달하는 더 작은 설계로 충분할 수도 있습니다. 객체 하나를 만들기 위해 불필요하게 많은 계층을 만들 필요는 없습니다.
확인 문제
밝은 테마 버튼과 밝은 테마 입력 상자가 반드시 함께 만들어져야 합니다. 어떤 팩토리의 목적과 더 가까울까요?
해설 보기
서로 관련된 제품 가족을 만드는 추상 팩토리의 목적에 가깝습니다. 다만 필요한 기능이 작다면 함수나 작은 객체로도 그 일관성을 지킬 수 있습니다.