의도
빌더패턴을 사용하기 위한 의도는 다음과 같습니다.
복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리, 서로 다른 표현도 같은 공정활용을 목적으로 하는 패턴
활용
- 빌더패턴은 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때 유용합니다.
- 합성할 객체들의 표현이 서로 달라도 보유한 구축 공정이 이를 지원해야 하는 경우
구조 이해
Builder pattern을 표현 한 Class diagram 은 다음과 같습니다.
Director 는 Builder 를 클래스 내부에 가지고 있으며 ( aggregation ) buildPart operation 을 통해 제품을 생성합니다.
구현 시, ConcreteBuilder 를 추상화 한 클래스(Builder) 를 우선 만들어 줍니다. Builder class 에 구현 된 buildPart 메서드는 Director에 의해 호출됩니다.
Builder 클래스의 buildPart 메서드는 C++에서는 순수가상함수, Java 에서는 interface 로 생성하며, 실제 동작은 ConcreteBuilder Class 에서 상속받아 구현합니다. Class Diagram 에도 상속의 의미로 Generalization 표현이 되어 있습니다.
전체적인 흐름을 정리하면,
Director는 Builder 인스턴스로 buildPart를 호출하고, Builder는 ConcreteBuilder에 구현 된 알고리즘에 따라 Product를 생성하여 Director에게 전달하게 됩니다. 실제 ConcreteBuilder에 의해 필요한 제품 객체가 만들어 지는 것이죠.
위에서 "합성할 객체들의 표현이 서로 달라도 보유한 구축 공정이 이를 지원해야 하는 경우" 에 빌더패턴을 사용한다고 하였는데요, Product2를 만들어야 하는 상황으로 가정해 보겠습니다.
Product2를 만들기 위해서는 ConcreteBuilder2 클래스를 만들어 주고 Builder 클래스를 상속받아 Product2 를 만들어 내는 구현을 순수가상함수 또는 interface에 구현 해 줌으로 써 새로운 Product를 추가할 수 있습니다.
따라서 우리는 Builder라는 동일한 공정으로 다양한 Product 객체를 생성할 수 있게 되는 결과를 얻을 수 있습니다.