異なるクラスA,Bがあり、それらのインスタンスを使用して「あるもの」を構築 (Builder) するためのメソッドの呼び出し手順は同じである場合を考えます。共通の構築手順の中で必要となるメソッド群を抽象クラスに記述しておき、クラスA,Bで継承し具体的内容を実装し、共通の構築手順自体をDirectorクラスに記述することで、「あるもの」を構築するための具体的な手順や内容をMainに対して隠蔽することができます。
sample.java
class Sample {
public static void main(String args[]) {
ConcreteBuilder concreteBuilder = new ConcreteBuilder();
Director director = new Director(concreteBuilder);
director.construct();
System.out.println(concreteBuilder.getResult());
}
}
Director.java
class Director {
private Builder builder;
public Director(Builder builder) {this.builder=builder;}
public void construct() {
builder.step1("step1");
builder.step2("step2");
builder.step3("step3");
}
}
Builder.java
abstract class Builder {
public abstract void step1(String str);
public abstract void step2(String str);
public abstract void step3(String str);
}
ConcreteBuilder.java
class ConcreteBuilder extends Builder {
private StringBuffer buf = new StringBuffer();
public void step1(String str) {buf.append(str+" ");}
public void step2(String str) {buf.append(str+" ");}
public void step3(String str) {buf.append(str);}
public String getResult() {return buf.toString();}
}
$ javac Builder.java ConcreteBuilder.java Director.java sample.java && java Sample
step1 step2 step3