pursuedream
成功=水平+业务+沟通+判断

建造者(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();

posted on 2007-03-17 14:24  pursuedream  阅读(192)  评论(0)    收藏  举报