liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - Builder

【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