생성자 패턴 ( Abstract Factory / Builder)

Manx·2023년 7월 27일

생성자 패턴


1. 추상 팩토리 패턴 ( Abstract Factor Pattern )

여러 객체로 구성된 복합 객체를 만들어야할 때, 포함된 객체가 모두 특별한 한 계통일 때 사용


A. 고전적인 추상 팩토리

DiagramFactory는 일반 텍스트를 만드는 클래스

SvgDiagramFactory는 그래픽적인 형태를 만드는 클래스

create_diagram은 다이어그램 팩토리를 인자로 받아 다이어그램을 생성한다.

→ 다이어그램 팩토리 인터페이스를 지원하는 한 어떤 종류의 다이어그램 팩토리여도 관계가 없다.


DiagramFactory와 SvgDiagramFactory의 구현

유일한 차이점은 반환되는 객체 타입이다.

Diagram의 객체 or SvgDiagram의 객체


B. Pythonic한 방법

기존의 문제점

  1. 어느 팩토리든 상태를 가지고 있을 필요가 없으므로 인스턴스를 생성할 필요가 없다.
  2. SvgDiagramFactory와 DiagramFactory 코드는 거의 유사하고, 유일한 차이는 반환되는 인스턴스 타입이다.
  3. 이름 충돌을 피하기 위해 Svg 클래스 이름에 접두어를 붙여야 했다. Ex. SvgRectangle

해결 방안

Diagram, Rectangle, Text 클래스를 DiagramFactory 클래스의 Inner Class로 만든다.

각 메소드를 classmethod로 만든다.


💡 DiagramFactory를 상속받은 SvgDiagramFactory는 더이상 make_digram, make_rectangle `메소드를 Override할 필요 없다.`

classmethod를 만듦으로 인해 객체의 생성 없이 Diagram Instance를 반환할 수 있다.


2. 빌더 패턴 (Builder Pattern)

  • 복잡한 객체를 만드는 것을 돕는 역할
  • 객체의 복잡성은 단계별 생성을 필요로 한다.

다양한 종류의 매개변수들로 User를 생성해야 하는 경우,

다음과 같이 생성자가 기하 급수적으로 늘어난다.

이럴 때에는, Builder 패턴을 활용하여 User 객체를 만드는 것이 훨씬 효율적이다.

Python 예제

각 폼을 생성한 다음 적절한 파일에 저장한다.


create_login_form()에 적절한 빌더 객체를 인자로 전달해 호출한다.


HtmlFormBuilder와 TkFormBuilder 모두 추상 기반 클래스인 AbstractFormBuilder를 상속한다.


abc.ABCMeta의 메타클래스를 전달하면 인스턴스를 만들 수 없기 때문에 추상 기반 클래스로만 사용해야 한다.
→ 실행 시 약간의 비용이 더 든다.

대다수의 파이썬 프로그래머는 문제가 될 수 있는 더 안일한 방법을 활용한다.
→ 메타클래스를 활용하지 않고, 해당 클래스를 추상 기반 클래스로 사용해야 한다고 문서화한다.

3. 팩토리 메서드 패턴 ( Factory Method Pattern )

  • 객체 생성을 요청할 때 하위 클래스가 인스턴스화할 클래스를 지정할 수 있게끔 고안된 패턴
  • 생성하려는 클래스가 어떤 것인지 모를 때도 활용할 수 있다.

⇒ 아는 내용이므로 Pass


출처
https://www.baeldung.com/
'파이썬 인 프랙티스'

2개의 댓글

comment-user-thumbnail
2023년 7월 27일

좋은 글 감사합니다.

1개의 답글