본문 바로가기
카테고리 없음

[디자인패턴] 빌더패턴(Builder Pattern) 개념 및 특징

by Warehaus 2022. 8. 12.

 

의도

 

빌더패턴을 사용하기 위한 의도는 다음과 같습니다.

 

복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리, 서로 다른 표현도 같은 공정활용을 목적으로 하는 패턴

 

활용

 

- 빌더패턴은 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때 유용합니다.

- 합성할 객체들의 표현이 서로 달라도 보유한 구축 공정이 이를 지원해야 하는 경우

 

 

구조 이해

 

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 객체를 생성할 수 있게 되는 결과를 얻을 수 있습니다.