그 이름에서 알 수 있듯 구조를 가진 인스턴스를 구축해나가는 패턴이다.
교재의 예제는 이 패턴을 이용해서 문서(html)파일을 작성하는 프로그램을 보여준다.
문서 파일의 구조는 타이틀, 문자열, 항목을 포함하는 구조로 이루어져 있다.
클래스는 총 5개로, Builder, Director, TextBuilder, HTMLBuilder, Main으로 구성되어있다.
자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
https://www.youngin.com/reader/pds/pds.asp
먼저 클래스로 선언한 부분을 인터페이스로 바꿔준다.
//Builder.java
//public abstract class Builder {
public interface Builder{
다음으로 builder 클래스를 기존에 상속(extends)받았던 TextBuilder, HTMLBuilder 두 가지를 implements로 수정해준다.
HTMLBuilder.java
//public class HTMLBuilder extends Builder
public class HTMLBuilder implements Builder
그리고
TextBuilder.java
//public class TextBuilder extends Builder
public class TextBuilder implements Builder
Director.java 파일 내부에 makeTitle, makeString, makeItems 의 각 " " 안의 내용을 내 임의로 수정해주면 된다.
해설에서는 기존의 HTMLBuilder.java, TextBuilder.java 파일을 삭제하고 다른 GUI를 생성해 ConcreteBuildered 역할을 수행하게 하고자 한다.
해당 클래스의 이름은 FrameBuilder 이라고 하자.
또한 Builder를 상속받기 때문에 makeTitle, makeString, makeItems 메서드를 이용한다.
추가된 점은 GUI를 구성할 것이기 때문에, 아래의 코드처럼 JFrame과 해당 프레임 안에 들어갈 박스버튼을 선언해주어야 한다.
private JFrame frame = new JFrame();
private Box box = new Box(BoxLayout.Y_AXIS);
그리고 각각의 makeTitle, makeString, makeItems 내부에는 프레임 혹은 라벨을 붙여준다.
거기에 더하여 windowListenter에 대한 설정이 필요하므로 close 메소드에 이를 추가한다.
@Override
public void close() {
frame.getContentPane().add(box);
frame.pack();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
FrameBuilder framebuilder = new FrameBuilder();
Director director = new Director(framebuilder);
director.construct();
JFrame frame = framebuilder.getFrameResult();
frame.setVisible(true);
}
}
TextBuilder에서 사용된 StringBuilder()는 어떤 것이냐면, 아래와 같다.
public StringBuilder()
Constructs a string builder with no characters in it and an initial capacity of 16 characters.
이어서 String()은 어떤 것이냐면, 아래와 같다.
java.lang.String
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
그래서 String으로 사용하되 조금의 수정을 가미하면 아무 문제가 없다.
기존의 아래와 같은 코드를
public class TextBuilder extends Builder {
private StringBuilder sb = new StringBuilder();
@Override
public void makeTitle(String title) {
sb.append("==============================\n");
sb.append("[");
sb.append(title);
sb.append("]\n\n");
}
...
아래와 같이 수정해준다.
public class TextBuilder extends Builder {
private String text = "";
@Override
public void makeTitle(String title) {
text += "==============================\n";
text += "[" + title + "]\n";
text += "\n";
}
변수를 sb에서 text로 바꿨다는 점과 .append()를 +=으로 바꿨다는 점에서 차이를 가진다.