デザインパターン - Builder
集合体を決められたAPIで順次走査を行う場合に使用する。
【Builderパターンのクラス図】
【Builderパターンのメリット】
同じ作成過程(Directorの役)で違う属性のものが作れる。
下記サンプルでは、塩水を作ってますが、同じ濃度のレモン水も簡単に作れますね。
【サンプル】
Builder.java |
package builder;
/*
* ビルダーIF
*/
public interface Builder{
// 溶質追加
public void addSolute(double soluteAmount);
// 溶媒追加
public void addSolvent(double solventAmount);
// 溶液捨て
public void abandonSolution(double solutionAmount);
// 結果取得
public Object getResult();
}
|
Director.java |
package builder;
/*
* ディレクタ
*/
public class Director {
// どうゆうビルダーかはわからん・・・
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
// どうゆうビルダーかはわからん・・・
// けど、同じ作法でつくる
public void contract() {
// 溶質100追加
System.out.println("溶質を100追加");
builder.addSolute(100);
// 溶媒10追加
System.out.println("溶媒を10追加");
builder.addSolvent(10);
// 溶質50追加
System.out.println("溶質を50追加");
builder.addSolute(50);
// 溶液50捨てる
System.out.println("溶液を50追加");
builder.abandonSolution(50);
}
}
|
SaltWater.java |
package builder;
// 塩水
public class SaltWater{
public double salt;
public double water;
public SaltWater(double water,double salt){
this.salt = salt;
this.water = water;
}
}
|
SaltWaterBuilder.java |
package builder;
/*
* 塩水ビルダー
*/
public class SaltWaterBuilder implements Builder {
private SaltWater saltWater;
public SaltWaterBuilder() {
saltWater = new SaltWater(0, 0);
}
@Override
public void addSolute(double soluteAmount) {
// 水追加
this.saltWater.water += soluteAmount;
}
@Override
public void addSolvent(double solventAmount) {
// 塩追加
this.saltWater.salt =+ solventAmount;
}
@Override
public void abandonSolution(double saltWaterAmount) {
// 捨てる塩水内の塩量
double saltDelta = saltWaterAmount *
(saltWater.salt / (saltWater.salt + saltWater.water));
// 捨てる塩水内の水量
double waterDelta = saltWaterAmount *
(saltWater.water / (saltWater.salt + saltWater.water));
saltWater.salt -= saltDelta;
saltWater.water -= waterDelta;
}
@Override
public Object getResult() {
return this.saltWater;
}
}
|
BuilderTest.java |
package builder;
public class BuilderTest {
public static void main(String[] args) {
// 塩水ビルダー生成
Builder builder = new SaltWaterBuilder();
// ディレクタ
Director director = new Director(builder);
// 塩水作成
director.contract();
// 塩水取得
SaltWater saltWater = (SaltWater) builder.getResult();
System.out.print("水量は" + saltWater.water);
System.out.print("塩量は" + saltWater.salt);
}
}
|
テスト結果 |
溶質を100追加
溶媒を10追加
溶質を50追加
溶液を50追加
水量は103.125塩量は6.875
|