본문 바로가기

Design Pattern

[Java-Pattern] Builder

문서작성 프로그램을 예제로..


Builder라는 추상 클래스를 만들고 여기에 추상메서드

makeTitle,makeString,makeItems,getResult라는 메서드를 둔다..


그리고 Builder를 상속하는 TextBuilder,HTMLBuilder 클래스를 만들고


위 추상 메서드들을 구현하여 준다.


이름만 봐도 알겠지만


하나는 텍스트로 만들어서 뿌려주는 클래스고 하나는 html형식으로 파일을 만들어주는 클래스이다.



그리고 클라이언트쪽에서는 저 Builder를 직접 호출하는 것이 아니라


Director라는 클래스를 통해서 호출한다.


Director클래스는


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();                 // 완성된 문서가 반환 값이 된다.
    }
}

이렇게 구현되어있다. builder클래스에 정의되어있는 API를 사용하여

원하는 작업을 하는 것이다. 물론 Director클래스는 자기가 사용하고 있는 API가 TextBuilder의 것인지 HTMLBuilder의 것인지 알지 못 한다.. (독립적이다..)


Builder를 상속하는 하위클래스를 만들어 얼마든지 기능을 확장 할 수 있으며


클라이언트 입장에서는 단지


Director director = new Director(new TextBuilder());
            String result = (String)director.construct();
            System.out.println(result);


이런식으로 director를 통해서 Builder를 상속한 하위클래스를 넘겨주기만 하면 된다.