GoF의 디자인 패턴, 두번째 빌더 패턴에 대해 알아본다.
해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.
핵심 요약
복잡한 구성의 객체를 효과적으로 생성하는 패턴
- 두가지 경우에 자주 사용됨
- 생성시 지정해야 하는 인자가 많을 때
- 객체 생성시 여러단계를 순차적으로 거칠 때
- 단계의 순서를 결정해두고 각 단계를 다양하게 구현할 수 있도록 함
- 이 글에서는 두번째 경우를 주로 설명함
예시
- 데이터를 받아 여러 포맷으로 변경하는 작업을 해야한다고 생각해보자.
- Director는 Builder를 받아 맞는 포맷의 순서로 조작한 뒤 결과를 만들 것이다.
internal func main() {
var data = Data(name: "wansik", age: 28)
var builder: Builder = PlainTextBuilder(data: data)
var director = Director(builder: builder)
var result = director.build()
print(result)
data = Data(name: "wansik", age: 28)
builder = JSONBuilder(data: data)
director = Director(builder: builder)
result = director.build()
print(result)
data = Data(name: "wansik", age: 28)
builder = XMLBuilder(data: data)
director = Director(builder: builder)
result = director.build()
print(result)
}
- 만들어진 Builder는 Data를 변환하는데 사용된다.
- Builder class를 사용하는 class라면 모두 Director라 할 수 있다.
- Builder 패턴은 Template, Facade, Strategy 패턴을 객체의 생성 과정에 적용했다고도 볼 수 있다.
- Director는 Builder객체가 가지는 method들의 사용을 단순화 시켜주고 있다. (Facade)
- Builder를 통해 생성하는 과정에서 호출되는 method를 interface로 선언하고, 구현은 하위 클래스에서 한 뒤, method들의 호출 방식을 Director에서 처리하는 것 (Template 응용)
- 원하는 상황에 맞는 형식에 문자열로 변환 (Strategy)
- 사실 단순하고, OOP의 기본 원칙을 적용하면 나오는 것이기 때문에 다른 곳에서도 종종 살펴볼 수 있다.
활용성
- 객체 생성에 있어 인자가 많은 경우
- 객체의 생성 알고리즘이 달라질 필요가 있을 때
참여자
- Builder(
Builder
): Product 객체의 일부 요소를 생성하기 위한 추상 인터페이스를 정의
- ConcreteBuilder(
PlainTextBuilder
...): Builder 인터페이스를 구현하며 부품을 모아 제품을 조립함
- Director(
Director
): Builder 인터페이스를 사용하는 객체를 가지고 제품을 합성함
- Product(
String
): 생성할 복합 객체
협력 방법
- Client는 Director 객체를 생성하고, Builder를 통해 객체를 합성한다.
- 제품의 일부가 구축될 때마다 Director는 Builder에 알린다.
- Builder는 Director의 요청을 처리하여 제품에 부품을 추가한다.
- Director는 Builder에서 제품을 검색한다.(리턴 받는다.)
결과
- 제품에 대한 내부 표현을 다양하게 변화할 수 있다.
- 생성과 표현에 대한 코드를 분리한다.
- 생성은 Builder, 표현은 Director
- 복합 객체를 생성하는 절차를 좀더 세밀하게 나눌 수 있다.
- Builder에는 제품을 만드는 과정 자체가 반영되어 있다.
- 그렇기 때문에 이 순서를 조작하는 행위를 좀더 세밀하게 처리할 수 있다.
관련 패턴과 차이점
- 복잡한 객체를 생성해야 한다면 추상 팩토리 패턴은 빌더 패턴과 유사할 수 있다.
- 근본적인 차이가 있다면, 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔다는 것이다.
- 반면 추상 팩토리 패턴은 제품의 유사군이 존재할 때 유연한 설계에 중점을 둔다는 것이다.
- 빌더 패턴은 생성의 마지막에 제품을 반환한다.
- 추상 팩토리 패턴은 즉시 제품을 반환한다.
Reference