โ๏ธ Java Design-Pattern โ ง - Builder
โ๏ธ Java Design-Pattern โ
ง - Builder
๐
ใJAVA ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธ ํจํด : ์ฝ๊ฒ ๋ฐฐ์ฐ๋ GoF์ 23๊ฐ์ง ๋์์ธ ํจํดใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Builder
ํจํด์ด๋?
- ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๊ฐ๋ ํจํด์ย
Builder
ย ํจํด์ด๋ผ๊ณ ํ๋ค.
์์ ํ๋ก๊ทธ๋จ
- ๋ค์์ย
Builder
ย ํจํด์ ์ด์ฉํด ๋ฌธ์๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ํ๋ก๊ทธ๋จ์ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค.
โํ์ดํ์ ํ ๊ฐ ํฌํจํ๋ค.โ
โ๋ฌธ์์ด์ ๋ช ๊ฐ ํฌํจํ๋ค.โ
โํญ๋ชฉ์ ๋ช ๊ฐ ํฌํจํ๋ค.โ
Builder
ย ์ถ์ ํด๋์ค์์๋ ๋ฌธ์๋ฅผ ๊ตฌ์ฑํ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค.Director
ย ํด๋์ค๋ ๊ทธ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ตฌ์ฒด์ ์ธ ํ๋์ ๋ฌธ์๋ฅผ ๋ง๋ ๋ค.TextBuilder
,ยHTMLBuilder
ย ํด๋์ค๋ยBuilder
ย ํด๋์ค๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
Builder
ย ํด๋์ค
1
2
3
4
5
6
public abstract class Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String string);
public abstract void makeItems(String[] items);
public abstract void close();
}
- ๋ฌธ์๋ฅผ ๋ง๋๋ ์ถ์ ๋ฉ์๋๋ค์ ์ ์ธํ ์ถ์ ํด๋์ค์ด๋ค.
Director
ย ํด๋์ค
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
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.makeTitle("Greeting");
builder.makeString("์ผ๋ฐ์ ์ธ ์ธ์ฌ");
builder.makeItems(
new String[]{
"How are you?",
"Hello",
"Hi"
}
);
builder.makeString("์๊ฐ๋๋ณ ์ธ์ฌ");
builder.makeItems(
new String[]{
"Good morning",
"Good afternoon",
"Good evening"
}
);
builder.close();
}
}
Director
ย ํด๋์ค ์์ฑ์์ ์ธ์๋กยBuilder
ํ ํ๋๋ฅผ ๊ฐ๋๋ค.- ๊ทธ๋ฐ๋ฐ ํด๋น ํด๋์ค๋ ์ถ์ ํด๋์ค์ด๋ฏ๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ์์ ์ค์ ๋ก ์ ๋ฌ๋๋ ๊ฒ์ย
Builder
ย ํด๋์ค์ ํ์ ํด๋์ค์ธยTextBuilder
ย ๋๋ยHTMLBuilder
ย ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋๋ค. construct
ย ๋ฉ์๋๋ ๋ฌธ์๋ฅผ ๋ง๋๋ ๋ฉ์๋์ด๋ค.
TextBuilder
ย ํด๋์ค
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
public class TextBuilder extends Builder {
private StringBuffer sb = new StringBuffer();
@Override
public void makeTitle(String title) {
sb.append("==================================\n");
sb.append("[");
sb.append(title);
sb.append("]\n\n");
}
@Override
public void makeString(String string) {
sb.append("โ ");
sb.append(string);
sb.append("\n\n");
}
@Override
public void makeItems(String[] items) {
for (String s : items) {
sb.append(" .");
sb.append("s");
sb.append("\n");
}
sb.append("\n");
}
@Override
public void close() {
sb.append("==================================\n");
}
public String getResult() {
return sb.toString();
}
}
- ๋ฌธ์๋ฅผ ์์ฑํ์ฌย
String
ย ํํ๋ก ๋ฐํํ๋ค.
HTMLBuilder
ย ํด๋์ค
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
import java.io.*;
public class HTMLBuilder extends Builder {
private String filename = "untitled.html";
private StringBuffer sb = new StringBuffer();
@Override
public void makeTitle(String title) {
filename = title + ".html";
sb.append("<!DOCTYPE html>\n");
sb.append("<html>\n");
sb.append("<head><title>");
sb.append(title);
sb.append("</title></head>\n");
sb.append("<body>\n");
sb.append("<h1>");
sb.append(title);
sb.append("</h1>\n\n");
}
@Override
public void makeString(String string) {
sb.append("<p>");
sb.append(string);
sb.append("</p>");
}
@Override
public void makeItems(String[] items) {
sb.append("<ul>\n");
for (String s : items) {
sb.append("<li>");
sb.append(s);
sb.append("</li>\n");
}
sb.append("</ul>\n\n");
}
@Override
public void close() {
sb.append("</body>");
sb.append("</html>\n");
try {
Writer writer = new FileWriter(filename);
writer.write(sb.toString());
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getHtmlResult() {
return filename;
}
}
HTML
ย ํ์ผ ํํ๋ก ๋ฌธ์๋ฅผ ์์ฑํ์ฌยHTML
ย ํ์ผ์ ํ์ผ๋ช ์ ๋ฐํํ๋ค.
Main
ย ํด๋์ค
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
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) {
if (args.length != 1) {
usage();
System.exit(0);
}
if (args[0].equals("text")) {
TextBuilder textBuilder = new TextBuilder();
Director director = new Director(textBuilder);
director.construct();
String result = textBuilder.getTextResult();
System.out.println(result);
} else if (args[0].eqauls("html")) {
HTMLBuiler htmlBuilder = new HTMLBuilder();
Director director = new Director(htmlBuilder);
director.construct();
String filename = htmlBuilder.getHtmlResult();
System.out.println("HTML ํ์ผ" + filename + "์ด ์์ฑ๋์์ต๋๋ค.");
} else {
usage();
System.exit(0);
}
}
public static void usage() {
System.out.println("Usage: java Main text ํ
์คํธ๋ก ๋ฌธ์ ์์ฑ");
System.out.println("Usage: java Main html HTML ํ์ผ๋ก ๋ฌธ์ ์์ฑ");
}
}
- ์ปค๋งจ๋ ๋ผ์ธ์์ย
java Main text
์ ๊ฐ์ดยtext
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํ ๊ฒฝ์ฐยTextBuilder
ย ํด๋์ค์ ์ธ์คํด์ค๋ฅผยDirector
ย ํด๋์ค์ ์์ฑ์์ ์ ๋ฌํ๋ค. - ๋ฐ๋ฉดย
html
์ ์ง์ ํ ๊ฒฝ์ฐ์๋ยHTMLBuilder
ย ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ ๋ฌํ๋ค. Builder
์ ๋ฉ์๋๋ง ์ฌ์ฉํ๋ค๋ ๊ฒ์ยDirector
๋ ์ค์ ๋ก ๋์ํ๋ ๊ฒ์ดยTextBuilder
์ธ์งยHTMLBuilder
์ธ์ง ์์ํ์ง ์๋๋ค.Builder
๋ ๋ฌธ์ ๊ตฌ์ถ์ ํ์ํ ์ถฉ๋ถํ ๋ฉ์๋๋ฅผ ๊ตฌ์ฑํ๋, ํ ์คํธ๋ยHTML
ย ํ์ผ์ ์์ฑํ๋ ๋ฐ ๊ณ ์ ํ ๋ฉ์๋๊น์ง ์ ๊ณตํด์๋ ์ ๋๋ค.- ์์กด์ฑ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
Builder
ย ํจํด์ ๋ฑ์ฅ์ธ๋ฌผ
Builder
ย ํด๋์ค
- ์ธ์คํด์ค ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฐ์ ํ๋ ๊ฑด์ถ๊ฐย
Builder
ย ์ญํ ์ ํ๋ค. - ๊ฑด์ถ๊ฐ ์ญํ ์๋ ์ธ์คํด์ค์ ๊ฐ ๋ถ๋ถ์ ๋ง๋๋ ๋ฉ์๋๊ฐ ์ค๋น๋๋ค.
TextBuilder
,ย HTMLBuilder
ย ํด๋์ค
- ๊ฑด์ถ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ๊ฑด์ถ๊ฐย
ConcreteBuilder
ย ์ญํ ์ด๋ค. - ์ค์ ์ธ์คํด์ค ์์ฑ์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋๊ฐ ์ฌ๊ธฐ์ ๊ตฌํ๋๋ฉฐ, ์ต์ข ์ ์ผ๋ก ์์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฉ์๋๊ฐ ์ค๋น๋๋ค.
Director
ย ํด๋์ค
- ๊ฑด์ถ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฐ๋
๊ดย
Director
ย ์ญํ ์ ํ๋ค.ย - ๊ตฌ์ฒด์ ์ธ ๊ฑด์ถ๊ฐ ์ญํ ์ด ๋ฌด์์ด๋ ์ ์๋ํ๋๋ก ๊ฑด์ถ๊ฐ์ ๋ฉ์๋๋ง ์ฌ์ฉํ๋ค.
Main
ย ํด๋์ค
Builder
ย ํจํด์ ์ด์ฉํ๋ ์๋ขฐ์ธยClient
์ด๋ค.
์ฑ ์์ ์ ์ํ๋ ํํธ
๋๊ฐ ๋ฌด์์ ์๊ณ ์๋๊ฐ?
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ด๋ ํด๋์ค๊ฐ ์ด๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋์ง๊ฐ ๋งค์ฐ ์ค์ํ๋ฏ๋ก ์ฃผ์ํด์ ํ๋ก๊ทธ๋๋ฐ ํด์ผ ํ๋ค.
Main
ย ํด๋์ค๋ยDirector
ย ํด๋์ค์ ๋ฉ์๋๋ง ํธ์ถํ๋ฏ๋กยBuilder
ย ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ชจ๋ฅธ๋ค.Director
ย ํด๋์ค๋ยBuilder
ย ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ง๋ง ์ค์ ๋ก ์ด๋ค ๊ตฌํ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ด์ฉํ๋์ง ๋ชจ๋ฅธ๋ค.ย- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด๋ฅผ ๊ต์ฒดํ ์ ์๋ ๊ฒ์ด๋ค.ย
- ํญ์ ๊ต์ฒด ๊ฐ๋ฅ์ฑ์ ์ผ๋์ ๋๊ณ ํ๋ก๊ทธ๋๋ฐ ํด์ผ ํ๋ค.
์์กด์ฑ ์ฃผ์
- ์์ย
Director
ย ํด๋์ค๋ยBuilder
์ ์ด๋ค ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ๋์ง ๋ชจ๋ฅธ๋ค๊ณ ํ๋ค. - ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก ๋์ํ๋ ค๋ฉดย
Builder
์ ๊ตฌ์ฒด์ ์ธ ์ธ์คํด์ค๊ฐ ํ์๋ก ํ์ํ๋ฏ๋กยDirector
๋ฅผ ์์ฑํ ๋ ์ธ์๋กยTextBuilder
ย ๋๋ยHTMLBuilder
๋ฅผ ๋ฃ์ดยbuilder
ย ํ๋์ ์ฃผ์ ํ๋ค. - ์ด๋ฅผ ์์กด์ฑ ์ฃผ์
ย
Dependency Injection
๋ผ๊ณ ํ๋ค. - ์์กด์ฑ ์ฃผ์ ์ด๋ โ์ด ์ธ์คํด์ค์ ์์กดํ์ฌ ๋์ํด์ฃผ์ธ์.โ๋ผ๋ ์๋ฏธ๋ฅผ ๋ด์ ์ธ์คํด์ค๋ฅผ ๊ฑด๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์ค๊ณ ์ ๊ฒฐ์ ์ฌํญ
Builder
ย ํด๋์ค๋ ๋ฌธ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ์ํ ์ถฉ๋ถํ ๋ฉ์๋๋ฅผ ์ ์ธํด์ผ ํ๋ค.ยDirector
ย ํด๋์ค์๊ฒ ์ฃผ์ด์ง๋ ๋๊ตฌ๋ยBuilder
ย ํด๋์ค๊ฐ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.- ๋ํ ๋ฏธ๋๋ฅผ ์์ ํ ์์ธกํ ์๋ ์์ง๋ง ์์ผ๋ก ๋์ด๋ ํ์ ํด๋์ค์๋ ์ด๋์ ๋ ๊ฒฌ๋ ์ ์๋๋ก ์ค๊ณ๋ฅผ ํด์ผ ํ๋ค.
์์ค๋ฅผ ์ฝ๊ณ ์์ ํ๋ ๋ฐฉ๋ฒ
- ์ด๋ฏธ ๋ง๋ค์ด์ง ์์ค ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ์ถ๊ฐํ ๋, ๊ธฐ์กด ์์ค๋ฅผ ์ฝ์ด์ผ ํ๋ค.
- ๊ทธ๋ฐ๋ฐ ์ถ์ ํด๋์ค๋ง ์ดํด๋ณธ๋ค๊ณ ์ ๋ณด๊ฐ ๊ทธ๋ค์ง ๋ง์ด ๋์ด๋์ง ์๋๋ค.
- ์์ ํ๋ก๊ทธ๋จ์ ์๋ก ๋ค๋ฉด ์ ์ด๋ย
Director
์ ์์ค๋ฅผ ์ฝ๊ณ ยBuilder
ย ํด๋์ค์ ์ฌ์ฉ๋ฒ์ ์ดํดํด์ผ ํ๋ค. - ์ดํ์๋ย
TextBuilder
,ยHTMLBuilder
ย ํด๋์ค๋ฅผ ์ฝ๊ณ ยBuilder
์ ์ถ์ ๋ฉ์๋์ ์ด๋ค ๋์์ด ๊ธฐ๋๋๋์ง ์ ์ ์๋ค. - ์์ค๋ฅผ ์ฝ๋ ๋จ์๋กย
@Override
๋ ๋์์ด ๋๋ค. - ํด๋์ค์ ์ญํ ์ ์ดํดํ์ง ๋ชปํ๋ฉด ์ค์๋กย
Director
ย ํด๋์ค๊ฐยBuilder
ย ํด๋์ค์ ํน์ ๊ตฌํ์ฒด๋ง์ ๋ฐ๋ผ๋ณด๋๋ก ํ๋ฉด ๋ ๋ฆฝ์ฑ์ด ์์๋์ด ์ธ์คํด์ค์ ๊ต์ฒด ๊ฐ๋ฅ์ฑ์ด ๋ฌด๋์ง ์ ์๋ค.
This post is licensed under CC BY 4.0 by the author.