http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzUWZibmJPWFFYVjQ
Builder 패턴-1
http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzWlhLUGZSVVppek0
Builder 패턴-2
http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzMGo1bVVmWVdIRUU
Builder 패턴-예제
public class Main {
public static void main(String[] args) {
if (args.length != 1) {
usage();
System.exit(0);
}
if (args[0].equals("plain")) {
Director director = new Director(new TextBuilder());
String result = (String)director.construct();
System.out.println(result);
} else if (args[0].equals("html")) {
Director director = new Director(new HTMLBuilder());
String filename = (String)director.construct();
System.out.println(filename + "이 작성되었습니다.");
} else {
usage();
System.exit(0);
}
}
public static void usage() {
System.out.println("Usage: java Main plain 일반 텍스트에서 문서작성");
System.out.println("Usage: java Main html HTML 파일에서 문서작성");
}
}
public class Director {
private Builder builder;
public Director(Builder builder) { // Builder의 하위 클래스의 인스턴스가 제공되기 때문에
this.builder = builder; // builder 필드에 보관해 둔다.
}
public Object construct() { // 문서 구축
builder.makeTitle("Greeting"); // 타이틀
builder.makeString("아침과 낮에"); // 문자열
builder.makeItems(new String[]{ // 항목
"좋은 아침입니다.",
"안녕하세요",
});
builder.makeString("밤에"); // 다른 문자열
builder.makeItems(new String[]{ // 다른 항목
"안녕하세요",
"안녕히 주무세요",
"안녕히 계세요",
});
return builder.getResult(); // 완성된 문서가 반환 값이 된다.
}
}
public abstract class Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract Object getResult();
}
public class HTMLBuilder extends Builder {
private String filename; // 작성할 파일명
private PrintWriter writer; // 파일에 기술할 PrintWriter
public void makeTitle(String title) { // HTML 파일에서의 타이틀
filename = title + ".html"; // 타이틀을 토대로 파일명을 결정
try {
writer = new PrintWriter(new FileWriter(filename)); // PrintWriter만든다.
} catch (IOException e) {
e.printStackTrace();
}
writer.println("<html><head><title>" + title + "</title></head><body>"); // 타이틀을 출력
writer.println("<h1>" + title + "</h1>");
}
public void makeString(String str) { // HTML 파일에서의 문자열
writer.println("<p>" + str + "</p>"); // <p>태그에서 출력
}
public void makeItems(String[] items) { // HTML 파일에서의 항목
writer.println("<ul>"); // <ul>과<li>에서 출력
for (int i = 0; i < items.length; i++) {
writer.println("<li>" + items[i] + "</li>");
}
writer.println("</ul>");
}
public Object getResult() { // 완성된 문서
writer.println("</body></html>"); // 태그를 만든다.
writer.close(); // 파일을 클로즈
return filename; // 파일명을 반환한다.
}
}
public class TextBuilder extends Builder {
private StringBuffer buffer = new StringBuffer(); // 이 필드에 문서를 구축한다.
public void makeTitle(String title) { // 일반 텍스트에서의 타이틀
buffer.append("==============================\\n"); // 장식선
buffer.append("『" + title + "』\\n"); // 『』가 붙은 타이틀
buffer.append("\\n"); // 공란
}
public void makeString(String str) { // 일반 텍스트에서의 문자열
buffer.append('■' + str + "\\n"); // ■이 붙은 문자열
buffer.append("\\n"); // 공란
}
public void makeItems(String[] items) { // 일반 텍스트에서의 항목
for (int i = 0; i < items.length; i++) {
buffer.append("●" + items[i] + "\\n"); // ●이 붙은 항목
}
buffer.append("\\n"); // 공란
}
public Object getResult() { // 완성된 문서
buffer.append("==============================\\n"); // 장식선
return buffer.toString(); // StringBuffer를String을 변환
}
}