문서작성 프로그램을 예제로..
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를 상속한 하위클래스를 넘겨주기만 하면 된다.