Builder Pattern은 객체 생성을 위한 Design Pattern이다.
이 Pattern의 목적은 다른 구현을 통해서 다른 형태의 Object를 조립 과정을 추상화 시키는 것이다. 종종 Design은 Factory Method(덜 복잡하고, 더욱 보편적이다.)에서 시작을 해서, Abstract Factory, Prototype, Builder와 같은 Pattern으로 변화시킬수 있다.
- 복잡한 객체를 생성하는 과정에 사용될 수 있다.
- 종종 Composite Pattern을 조립하는데 사용
- Method Chaining을 이용하여 객체를 구성하는데 유용하다. Method Chaining을 이용한 객체 생성 예)
1
2
3
4
5
6
7
8
em.createNamedQuery("Student.findByNameAgeGender")
.setParameter("name", name)
.setParameter("age", age)
.setParameter("gender", gender)
.setFirstResult(1)
.setMaxResults(30)
.setHint("hintName", "hintValue")
.getResultList();
예제 코드(출처 : Java 언어로 배우는 디자인 패턴 입문. 영진닷컴)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class BuilderPattern {
public static void main(String[] args) {
TextBuilder textBuilder = new TextBuilder();
Director director = new Director(textBuilder);
director.construct();
String result = textBuilder.getResult();
System.out.println(result);
HTMLBuilder htmlBuilder = new HTMLBuilder();
director = new Director(htmlBuilder);
director.construct();
String filename = htmlBuilder.getResult();
}
}
abstract class Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract void close();
}
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.makeTitle("Greeting");
builder.makeString("아침과 낮에");
builder.makeItems(new String[] {
"좋은 아침입니다.",
"안녕하세요.",
});
builder.makeString("밤에");
builder.makeItems(new String[] {
"안녕하세요.",
"안녕히 주무세요.",
"안녕히 계세요."
});
builder.close();
}
}
class TextBuilder extends Builder {
private StringBuffer buffer = new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("======================n");
buffer.append("(" +title + ")n");
buffer.append("n");
}
@Override
public void makeString(String str) {
buffer.append('*' +str + "n");
buffer.append("n");
}
@Override
public void makeItems(String[] items) {
for(int i = 0; i < items.length; i++) {
buffer.append(" -" + items[i] + "n");
}
buffer.append("n");
}
@Override
public void close() {
buffer.append("=======================n");
}
public String getResult() {
return buffer.toString();
}
}
class HTMLBuilder extends Builder {
private String filename;
private PrintWriter writer;
@Override
public void makeTitle(String title) {
filename = title + ".html";
try {
writer = new PrintWriter(new FileWriter(filename));
}catch(IOException e) {
e.printStackTrace();
}
writer.println("<html><head><title>" + title + "</title></head><body>");
writer.println("<h1>" + title + "</h1>");
}
@Override
public void makeString(String str) {
writer.println("<p>" + str + "</p>");
}
@Override
public void makeItems(String[] items) {
writer.println("<ul>");
for(int i = 0; i < items.length; i++) {
writer.println("<li>" + items[i] + "</li>");
}
writer.println("</ul>");
}
@Override
public void close() {
writer.println("</body></html>");
writer.close();
}
public String getResult() {
return filename;
}
}