C++공부/GoF의 디자인 패턴
빌더(Builder)
아헿헿헿
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가 자신에게 필요한 요소를 생성하도록 부모 클래스의 연산을 재정의합니다.
- 조합과 구축에 필요한 인터페이스 정의 - Builder가 단계별로 제품들을 생성하게 만들기 위해, 필요한 연산들을 재정의할 수 있도록, 추상 클래스에서 이를 생성과 졸합을 위한 모델을 구축합니다.
- 제품에 대한 추상 클래스 여부 - Builder로 만들어진 제품들이 Builder에 따라 같으면 공통의 인터페이스를 가지면 좋지만 공통점이 찾기 힘들기 때문에 필요로 되지 않습니다.
- Builder에 있는 메서드를 구현 X - Builder에 정의된 메서드를 의도적으로 가상 함수로 정의하지 않고 구현부를 비워둡니다. 이를 통해 ConcreteBuilder에서 모든 가상 함수가 아닌 필요한 메서드만 재정의하도록 합니다.