Home Builder Pattern
Post
Cancel

Builder Pattern

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();

builder pattern

예제 코드(출처 : 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;
    }
}
This post is licensed under CC BY 4.0 by the author.

Prototype Pattern

Bridge Pattern