建造者(Builder)模式(客户端决定什么时候创建,创建什么产品,建造者模式可以强迫生成顺序)
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。
此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些"零件"的组合过程往往被"外部化"到一个称作建造者的对象里,建造者返还给客户端的是一个全部零件都建造完毕的产品对象。
以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
使用建造者模式主要有以下效果:
1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。
客户端负责创建指导者和具体建造者对象。然后,客户把具体建造者对象交给指导者。客户一声令下,指导者操纵建造者开始创建产品。当产品创建完成后,建造者把产品返还给客户端。
Director dt=new Director(); //客户端创建指导者
Builder db=new BuilderOne(); //创建具体创建者
dt.Construct(db); //客户把具体建造者对象交给指导者,开始创建产品
Product pt=db.getResult(); //产品完成,返回于客户端
pt.Show();
分析创造者模式
类Director是指导者,客户端通过它来决定,要创建什么产品,什么时候创建
类Builder是所有相似产品要展现的功能集合
类BuilderOne和BuilderTwo是继承类Builder,它显示每种具体产品的信息
类Product是显示该具体产品的信息
//把所有产品要体现的内容综合一块
public abstract class Builder
{
public abstract void BuildPartOne();
public abstract void BuildPartTwo();
//依赖类Product
abstract public Product getResult();
}
//具体要创建什么产品
public class BuilderOne :Builder
{
private Product product;
public override void BuildPartOne()
{
product=new Product();
product.Add("PartOne");
}
public override void BuildPartTwo()
{
product.Add("PartTwo");
}
public override Product getResult()
{
return product;
}
}
//具体要创建什么产品
public class BuilderTwo :Builder
{
private Product product;
public override void BuildPartOne()
{
product=new Product();
product.Add("PartOneX");
}
public override void BuildPartTwo()
{
product.Add("PartTwoY");
}
public override Product getResult()
{
return product;
}
}
//体现产品的内容,也就通过它展现已经创造产品出产品拥有的信息
public class Product
{
ArrayList alPart=new ArrayList();
public void Add(string part)
{
alPart.Add(part);
}
public void Show()
{
foreach(string part in alPart)
{
Console.WriteLine(part);
}
}
}
//指导产品的创造,要创造什么产品,什么时候创造都有客户端决定
public class Director
{
public void Construct( Builder builder)
{
builder.BuildPartOne();
builder.BuildPartTwo();
}
}
客户端控制产品生产
Director dt=new Director();
Builder db=new BuilderOne();
dt.Construct(db);
Product pt=db.getResult();
pt.Show();
具体实例
public class Shop
{
// Methods
public void Construct( VehicleBuilder vehicleBuilder )
{
vehicleBuilder.BuildFrame();
vehicleBuilder.BuildEngine();
vehicleBuilder.BuildWheels();
vehicleBuilder.BuildDoors();
}
}
// "Builder"
public abstract class VehicleBuilder
{
// Fields
protected Vehicle vehicle;
// Properties
public Vehicle Vehicle
{
get{ return vehicle; }
}
// Methods
abstract public void BuildFrame();
abstract public void BuildEngine();
abstract public void BuildWheels();
abstract public void BuildDoors();
}
// "ConcreteBuilder1"
public class MotorCycleBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "MotorCycle" );
vehicle[ "frame" ] = "MotorCycle Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "500 cc";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "2";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "0";
}
}
// "ConcreteBuilder2"
public class CarBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "Car" );
vehicle[ "frame" ] = "Car Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "2500 cc";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "4";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "4";
}
}
// "ConcreteBuilder3"
public class ScooterBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "Scooter" );
vehicle[ "frame" ] = "Scooter Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "none";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "2";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "0";
}
}
// "Product"
public class Vehicle
{
// Fields
private string type;
private Hashtable parts = new Hashtable();
// Constructors
public Vehicle( string type )
{
this.type = type;
}
// Indexers
public object this[ string key ]
{
get{ return parts[ key ]; }
set{ parts[ key ] = value; }
}
// Methods
public void Show()
{
Console.WriteLine( " ---------------------------");
Console.WriteLine( "Vehicle Type: "+ type );
Console.WriteLine( " Frame : " + parts[ "frame" ] );
Console.WriteLine( " Engine : "+ parts[ "engine"] );
Console.WriteLine( " #Wheels: "+ parts[ "wheels"] );
Console.WriteLine( " #Doors : "+ parts[ "doors" ] );
}
}
客户端使用该具体产品
Shop shop = new Shop();
VehicleBuilder b1 = new ScooterBuilder();
VehicleBuilder b2 = new CarBuilder();
VehicleBuilder b3 = new MotorCycleBuilder();
// Construct and display vehicles
shop.Construct( b1 );
b1.Vehicle.Show();
shop.Construct( b2 );
b2.Vehicle.Show();
shop.Construct( b3 );
b3.Vehicle.Show();
浙公网安备 33010602011771号