빌더(Builder) 패턴
제품을 여러 단계로 나눠서 만들도록 제품 생상 단계를 캡슐화하고 싶다면 빌더 패턴이 적합하다.
빌더 패턴은 객체 생성을 더욱 유연하게, 가독성있고, 그리고 복잡성을 낮추기 위한 디자인 패턴 중 하나이다.
이 패턴은 복잡한 객체의 생성 과정을 추상화하고, 객체의 표현과 생성 프로세스를 분리하여 클라이언트가 서로 다른 표현 결과물을 생성할 수 있도록 한다.
- 복잡한 객체 생성
- 객체가 복잡하고 여러 단계에 걸쳐 생성되어야 할 때 빌더 패턴이 유용할 수 있다.
- 다양한 표현 결과물 생성
- 동일한 생성 프로세스에서 여러 다른 종류의 객체를 생성하고자 할 때 사용할 수 있다.
- 가독성 및 유지보수성 향상
- 생성자의 매개변수가 많고 복잡한 경우, 빌더 패턴을 사용하여 가독성을 향상시키도 코드를 더욱 유지보수하기 쉽게 만든다.
구성 요소

- Product: 생성될 객체
- Builder: 빌더
- 객체를 생성하는 추상 인터페이스
- 객체의 각 부분을 생성하기 위한 메서드들을 선언
- ConcreteBuilder
Builder
인터페이스를 구현하여 객체의 각 부분을 실제로 생성하는 클래스
- Director: 지시자
- 클라이언트와 함께 작동하여 실제로 객체를 생성하는 클래스
Builder
를 사용하여 객체의 생성 프로세스를 조절한다.
- Client
- 객체를 생성하고자 하는 클라이언트 코드
- 일반적으로
Director
를 사용하여 객체 생성 프로세스를 시작한다.
예시: HTML 문서 생성
HTMLDocument
가 생성될 최종 객체를 나타내고, HTMLBuilder
는 객체 생성을 위한 추상 인터페이스를 정의한다.
SimpleHTMLBuilder
는 HTMLBuilder
인터페이스를 구현하여 객체의 각 부분을 생성하고, HTMLDirector
는 실제로 객체의 생성 프로세스를 조절한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| // Product: 생성될 HTML 문서
public class HTMLDocument {
private String content;
public void setContent(String content) {
this.content = content;
}
public void display() {
System.out.println(content);
}
}
// Builder: HTML 문서 생성을 위한 인터페이스
public interface HTMLBuilder {
void buildHeader();
void buildBody();
void buildFooter();
HTMLDocument getResult();
}
// ConcreteBuilder: HTML 문서를 실제로 생성하는 클래스
public class SimpleHTMLBuilder implements HTMLBuilder {
private HTMLDocument document;
public SimpleHTMLBuilder() {
this.document = new HTMLDocument();
}
@Override
public void buildHeader() {
document.setContent("<header>Simple HTML Header</header>");
}
@Override
public void buildBody() {
document.setContent(document.content + "<body>Simple HTML Body</body>");
}
@Override
public void buildFooter() {
document.setContent(document.content + "<footer>Simple HTML Footer</footer>");
}
@Override
public HTMLDocument getResult() {
return document;
}
}
// Director: HTML 문서 생성 프로세스를 조절하는 클래스
public class HTMLDirector {
private HTMLBuilder builder;
public HTMLDirector(HTMLBuilder builder) {
this.builder = builder;
}
public void construct() {
builder.buildHeader();
builder.buildBody();
builder.buildFooter();
}
}
// Client: 빌더 패턴을 사용하는 클라이언트 코드
public class Client {
public static void main(String[] args) {
HTMLBuilder builder = new SimpleHTMLBuilder();
HTMLDirector director = new HTMLDirector(builder);
director.construct();
HTMLDocument document = builder.getResult();
document.display();
}
}
|
특징
빌더 패턴은 객체 생성을 유연하게 다루기 위한 디자인 패턴으로 이로인한 장단점이 존재한다.
장점
- 유연한 객체 생성
- 객체 생성 과정을 세분화하고 각 부분을 개별적으로 생성함으로써 객체 생성을 유연하게 다룰 수 있다.
- 다양한 조합으로 객체를 생성할 수 있다.
- 가독성 향상
- 생성자의 매개변수가 많은 경우, 빌더 패턴을 사용하여 가독성을 향상시킬 수 있다.
- 메개변수의 순서를 기억하지 않고도 명시적인 메서드 호출을 통해 객체를 초기화할 수 있다.
- 객체 표현의 분리
- 객체 생성과표현을 분리함으로써, 동일한 생성 로직을 사용하면서도 여러 다른 표현이 가능하다.
- 즉, 동일한 빌더로 다른 결과물을 만들 수 있다.
- 확장 용이성
- 새로운 부분 객체나 다른 종류의 객체를 추가하고자 할 때, 새로운 빌더를 구현하여 쉽게 확장할 수 있다.
단점
- 코드 복잡성
- 빌더 패턴을 도입하면 클래스의 수가 증가하고, 빌더 클래스와 디렉터 클래스가 추가로 필요하므로 코드의 복잡성이 증가할 수 있다.
- 성능 손실
- 객체 생성 시 매번 빌더 패턴을 사용하면 성능에 손실이 발생할 수 있다.
- 불필요한 빌더 클래스 생성
- 간단한 객체의 경우 빌더 패턴을 도입하면 오히려 불필요한 클래스들이 생성될 수 있다.
빌더 패턴은 객체 생성의 복잡성과 유연성을 고려할 때 선택해야 하는 패턴이다.
작은 규모의 객체나 단순한 객체 생성에는 불필요한 복잡성을 초래할 수 있으므로, 상황에 맞게 적절히 선택하는 것이 중요하다.