Builder 패턴

Jimin K·2023년 6월 7일
0

디자인 패턴

목록 보기
1/4






JAVA 언어로 배우는 디자인패턴 입문 책의 교재 및 예제 풀이를 정리해보려 한다.









Builder 패턴이란?


Builder 패턴은 복잡한 인스턴스를 조립한다.

그 이름에서 알 수 있듯 구조를 가진 인스턴스를 구축해나가는 패턴이다.

교재의 예제는 이 패턴을 이용해서 문서(html)파일을 작성하는 프로그램을 보여준다.

문서 파일의 구조는 타이틀, 문자열, 항목을 포함하는 구조로 이루어져 있다.

클래스는 총 5개로, Builder, Director, TextBuilder, HTMLBuilder, Main으로 구성되어있다.

자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
https://www.youngin.com/reader/pds/pds.asp





문제 1 : 예제 프로그램의 Builder 클래스를 인터페이스로 변경하고 그에 맞춰 다른 클래스를 수정하라




먼저 클래스로 선언한 부분을 인터페이스로 바꿔준다.

//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






문제 2 : 예제 프로그램의 Director 클래스이 construct 메소드를 수정해 다른 문서를 만들어보자. 이 때 TextBuilder 클래스나 HTMLBuilder 클래스를 수정할 필요가 전혀 없다.

Director.java 파일 내부에 makeTitle, makeString, makeItems 의 각 " " 안의 내용을 내 임의로 수정해주면 된다.





문제 3 : 예제 프로그램의 Builder 클래스의 하위 클래스로서 ConcreteBuilderd 역할을 할 수 있는 클래스를 작성하세요. 텍스트, HTML 파일 이외에 소재는 자유




해설에서는 기존의 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);
            }
        });
    }

이에 따라서 Main.java 파일도 수정이 필요한데, 기존에 html과 text 파일을 생성 하는 등의 동작을 빼고 JFrame을 import해 이를 생성하는 코드를 작성해준다.

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







문제 4 : TextBuilder 클래스에서 문서를 구축해 가는 필드 sb가 String 클래스가 아니라 StringBuilder 클래스로 되어있는 이유는 무엇인가. String을 사용하면 무슨 문제가 일어나나

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()를 +=으로 바꿨다는 점에서 차이를 가진다.

profile
아둥바둥

0개의 댓글