Builder パターン (複合化されたオブジェクトについて, その生成過程を隠蔽することにより, 同じ過程で異なる内部形式のオブジェクトを生成できる)

[Builder] という単語は, 建築者を意味する.

全体を構成している各部分の処理を積上げていくのが [Builder パターン] である.

役割

  1. Client (依頼者):
[Director] に建築指示を出す
  1. Diretor (監督者):
[ConcreteBuilder] の実態に関係なく, [Builder] に提供されているインタフェースのみを使用し, 建築する. その構築過程は, [Client] から隠蔽する.
  1. Builder (建築者):
建築過程の各メソッドのインタフェースを定める.
  1. ConcreteBuilder (具体的な建築者):
[Builder] が定めたインタフェースを実装する.

クラス図

Builder パターンのクラス図

_images/designpattern-builder012.gif

ソースコード

  1. Client.java
1
2
3
4
5
6
7
8
9
public class Client{
    public static void main(String[] args){
	String result = "";
	Director director = new Director(new ConcreteBuilder());
	
	result = (String)director.construct();
	System.out.println(result);
    }
}
  1. Director.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Director{
    private Builder builder;
    
    public Director(Builder builder){
	this.builder = builder;
    }

    public Object construct(){
	builder.part1("工程 1");
	builder.part2("工程 2");
	return builder.getResult();
    }
}
  1. Builder.java
1
2
3
4
5
public abstract class Builder{
    public abstract void part1(String str);
    public abstract void part2(String str);
    public abstract Object getResult();
}
  1. ConcreteBuilder.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class ConcreteBuilder extends Builder{
    private StringBuffer sb = new StringBuffer();

    public void part1(String str){
	sb.append("part1: " + str + System.getProperty("line.separator"));
    }

    public void part2(String str){
	sb.append("part2: " + str + System.getProperty("line.separator"));
    }

    public Object getResult(){
	return sb.toString();
    }
}

上記のプログラムの実行結果:

[wtopia Builder]$ java Client
part1: 工程 1
part2: 工程 2
(空白)