2009年10月10日星期六

Builder 设计模式

基本相同的创建过程可以创建不同的表现结果。比如盖房子,分为盖的过程和盖房子的素材两个部分,用铁可以盖铁的房子,用木头可以盖木头的房子。像这样,用决定制作过程的Director和决定表现形式的Builder两个部分的相互配合,可以更加灵活的生产对象,且制作过程也可以更好的控制。
现实中的例子,比如配置食盐溶液的问题:100g的水中添加40g食盐,然后将配好的食盐溶液倒掉70g后加水100g,最后再加食盐15g,求最后配好的实验溶液的实验含量百分比。
这个例子用Builder模式实现,Builder决定表现形式,并提供增减食盐,增减水等方法。Director决定配制食盐溶液的过程。用下面的程序实现。

//类:食盐水,有两个属性:salt,water;构造函数决定食盐和水的量。
public class SaltWater
{
public SaltWater(double water, double salt)
{
this._salt = salt;
this._water = water;
}
public double salt
{
get { return _salt; }
set { _salt = value; }
}
public double water
{
get { return _water; }
set { _water = value; }
}

private double _salt;
private double _water;

}
//接口Builder,决定表现形式。有个接口
public interface Builder
{
void addSolute(int soluteAmount);//添加溶剂
void addSoluvent(int solventAmount);//添加溶质
void abandonSolution(int solutionAmount);//倒掉一部分溶液
SaltWater getResult();//取得配置溶液。

}
//类Director,决定生成过程。
public class Director
{
private Builder builder;
public Director(Builder builder)//构造函数:生成表现形式。
{
this.builder = builder;
}
public void constract()//配置本例食盐水的过程。
{
builder.addSoluvent(100);
builder.addSolute(40);
builder.abandonSolution(70);
builder.addSoluvent(100);
builder.addSolute(15);
}
}
//实现接口Builder,食盐水。
public class SaltWaterBuilder: Builder
{
private SaltWater saltWater;
public SaltWaterBuilder(){
this.saltWater = new SaltWater(0,0);
}
public void addSolute(int saltAmount){
saltWater.salt += saltAmount;
}
public void addSoluvent(int waterAmount){
saltWater.water += waterAmount;
}
public void abandonSolution(int saltWaterAmount){
saltWater.salt *= 1 - saltWaterAmount / (saltWater.salt + saltWater.water);
saltWater.water *= 1 - saltWaterAmount / (saltWater.salt + saltWater.water);
}
public SaltWater getResult(){
return this.saltWater;
}
}
//Test
public static void Main()
{ //创建表现形式
Builder builder = new SaltWaterBuilder();
//创建生产过程。
Director dir = new Director(builder);
//生产
dir.constract();
//取得生产结果,配置好的食盐水。
SaltWater saltWater = (SaltWater)builder.getResult();
Console.Write(saltWater.salt/saltWater.water * 100 +"%");

}

执行结果:
24.7058823529412%

没有评论:

发表评论