아헿헿헿 2022. 5. 18. 18:14

1. 용도

여러가지를 구성하고 있는 복합 개체의 생성과 표현 방법을 정의하는 클래스를 별도로 분리하여, 다른 형태이더라도 동일한 방법으로 생성할 수 있도록 합니다.


2.  활용성

  • 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적인 경우
  • 합성할 객체들이 표현이 서로 다르더라도 생성 절차에서 이를 지원해야하는 경우

3. Class Diagram과 구조

[Builder] - Product 객체 일부 요소들을 생성하기 위한 추상 인터페이스를 정의

[ConcreteBuilder] - Builder의 인터페이스를 구현하여 Product를 생성 방식을 정의하며 생성한 요소의 표현을 정의하고 관리

[Director] - Builder 인터페이스를 사용하는 객체를 합성

[Product] - 생성할 복합 객체를 표현

 

사용자는 Director 객체를 생성하여 원하는 방식대로 Builder를 통해 객체를 만들어 나갑니다. 이 때 Director은 Builder에게 구축 요청을 보내고 Builder는 Director의 요청을 처리하여 제품의 일부를 구축하게 됩니다.


4. 장단점

장점

  • 제품에 대한 내부 표현의 다양성 - 일반적으로는 추상 인터페이스를 통해서만 객체를 조작하는 반면, 추상 팩토리에서는 객체의 생성은 팩토리에서 책임을 떠안아 역할이 분산되었습니다.
  • 생성과 표현의 코드 분리 - 팩토리의 변경으로 제품의 변경까지 한번에 변경 가능합니다.
  • 복합 객체 생성 절차의 세밀화 - 한번에 한 카테고리에 속한 제품 객체가 동작하도록 설계된 경우, 추상 팩토리를 통해 쉽게 구현 가능합니다.

5. 구현 방법

Builder에서 제공하는 인터페이스를 자식 클래스인 ConcreteBuilder가 자신에게 필요한 요소를 생성하도록 부모 클래스의 연산을 재정의합니다.

  1. 조합과 구축에 필요한 인터페이스 정의 - Builder가 단계별로 제품들을 생성하게 만들기 위해, 필요한 연산들을 재정의할 수 있도록, 추상 클래스에서 이를 생성과 졸합을 위한 모델을 구축합니다.
  2. 제품에 대한 추상 클래스 여부 - Builder로 만들어진 제품들이 Builder에 따라 같으면 공통의 인터페이스를 가지면 좋지만 공통점이 찾기 힘들기 때문에 필요로 되지 않습니다.
  3. Builder에 있는 메서드를 구현 X - Builder에 정의된 메서드를 의도적으로 가상 함수로 정의하지 않고 구현부를 비워둡니다. 이를 통해 ConcreteBuilder에서 모든 가상 함수가 아닌 필요한 메서드만 재정의하도록 합니다.