建造者模式

1.      定义:

           将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.      UML 类图

 

3.      结构代码

         该结构代码演示了复杂对象被一步一步创建的建造者模式。

// Builder pattern -- Structural example

using System;

using System.Collections.Generic;

namespace DoFactory.GangOfFour.Builder.Structural

{

  ///<summary>

  /// MainApp startup class for Structural

  /// Builder Design Pattern.

  ///</summary>

  publicclass MainApp

  {

    ///<summary>

    /// Entry point into console application.

    ///</summary>

    publicstatic void Main()

    {

      // Create director and builders

      Director director =new Director();

      Builder b1 =new ConcreteBuilder1();

      Builder b2 =new ConcreteBuilder2();

      // Construct two products

      director.Construct(b1);

      Product p1 = b1.GetResult();

      p1.Show();

 

      director.Construct(b2);

      Product p2 = b2.GetResult();

      p2.Show();

      // Wait for user

      Console.ReadKey();

    }

  }

  ///<summary>

  /// The 'Director' class

  ///</summary>

  classDirector

  {

    // Builder uses a complex series of steps

    publicvoid Construct(Builder builder)

    {

      builder.BuildPartA();

      builder.BuildPartB();

    }

  }

  ///<summary>

  /// The 'Builder' abstract class

  ///</summary>

  abstractclass Builder

  {

    publicabstract void BuildPartA();

    publicabstract void BuildPartB();

    publicabstract Product GetResult();

  }

  ///<summary>

  /// The 'ConcreteBuilder1' class

  ///</summary>

  classConcreteBuilder1 : Builder

  {

    privateProduct _product = newProduct();

 

    publicoverride void BuildPartA()

    {

      _product.Add("PartA");

    }

    publicoverride void BuildPartB()

    {

      _product.Add("PartB");

    }

    publicoverride Product GetResult()

    {

      return _product;

    }

  }

  ///<summary>

  /// The 'ConcreteBuilder2' class

  ///</summary>

  classConcreteBuilder2 : Builder

  {

    privateProduct _product = newProduct();

 

    publicoverride void BuildPartA()

    {

      _product.Add("PartX");

    }

 

    publicoverride void BuildPartB()

    {

      _product.Add("PartY");

    }

 

    publicoverride Product GetResult()

    {

      return _product;

    }

  }

 

  ///<summary>

  /// The 'Product' class

  ///</summary>

  classProduct

  {

    privateList<string> _parts =new List<string>();

 

    publicvoid Add(string part)

    {

      _parts.Add(part);

    }

 

    publicvoid Show()

    {

      Console.WriteLine("\nProduct Parts -------");

      foreach (string partin _parts)

        Console.WriteLine(part);

    }

  }

}


Output:
Product Parts -------
PartA
PartB

Product Parts -------
PartX
PartY



4.      实例代码

          该代码是一个交通工具的实例

// Builder pattern -- Real World example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Builder.RealWorld

{

  ///<summary>

  /// MainApp startup class for Real-World

  /// Builder Design Pattern.

  ///</summary>

  publicclass MainApp

  {

    ///<summary>

    /// Entry point into console application.

    ///</summary>

    publicstatic void Main()

    {

      VehicleBuilder builder;

 

      // Create shop with vehicle builders

      Shop shop =new Shop();

 

      // Construct and display vehicles

      builder = new ScooterBuilder();

      shop.Construct(builder);

      builder.Vehicle.Show();

 

      builder = new CarBuilder();

      shop.Construct(builder);

      builder.Vehicle.Show();

 

      builder = new MotorCycleBuilder();

      shop.Construct(builder);

      builder.Vehicle.Show();

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  ///<summary>

  /// The 'Director' class

  ///</summary>

  classShop

  {

    // Builder uses a complex series of steps

    publicvoid Construct(VehicleBuilder vehicleBuilder)

    {

      vehicleBuilder.BuildFrame();

      vehicleBuilder.BuildEngine();

      vehicleBuilder.BuildWheels();

      vehicleBuilder.BuildDoors();

    }

  }

 

  ///<summary>

  /// The 'Builder' abstract class

  ///</summary>

  abstractclass VehicleBuilder

  {

    protectedVehicle vehicle;

 

    // Gets vehicle instance

    publicVehicle Vehicle

    {

      get {return vehicle; }

    }

 

    // Abstract build methods

    publicabstract void BuildFrame();

    publicabstract void BuildEngine();

    publicabstract void BuildWheels();

    publicabstract void BuildDoors();

  }

 

  ///<summary>

  /// The 'ConcreteBuilder1' class

  ///</summary>

  classMotorCycleBuilder : VehicleBuilder

  {

    public MotorCycleBuilder()

    {

      vehicle = new Vehicle("MotorCycle");

    }

 

    publicoverride void BuildFrame()

    {

      vehicle["frame"] ="MotorCycle Frame";

    }

 

    publicoverride void BuildEngine()

    {

      vehicle["engine"] ="500 cc";

    }

 

    publicoverride void BuildWheels()

    {

      vehicle["wheels"] ="2";

    }

 

    publicoverride void BuildDoors()

    {

      vehicle["doors"] ="0";

    }

  }

 

 

  ///<summary>

  /// The 'ConcreteBuilder2' class

  ///</summary>

  classCarBuilder : VehicleBuilder

  {

    public CarBuilder()

    {

      vehicle = new Vehicle("Car");

    }

 

    publicoverride void BuildFrame()

    {

      vehicle["frame"] ="Car Frame";

    }

 

    publicoverride void BuildEngine()

    {

      vehicle["engine"] ="2500 cc";

    }

 

    publicoverride void BuildWheels()

    {

      vehicle["wheels"] ="4";

    }

 

    publicoverride void BuildDoors()

    {

      vehicle["doors"] ="4";

    }

  }

 

  ///<summary>

  /// The 'ConcreteBuilder3' class

  ///</summary>

  classScooterBuilder : VehicleBuilder

  {

    public ScooterBuilder()

    {

      vehicle = new Vehicle("Scooter");

    }

 

    publicoverride void BuildFrame()

    {

      vehicle["frame"] ="Scooter Frame";

    }

 

    publicoverride void BuildEngine()

    {

      vehicle["engine"] ="50 cc";

    }

 

    publicoverride void BuildWheels()

    {

      vehicle["wheels"] ="2";

    }

 

    publicoverride void BuildDoors()

    {

      vehicle["doors"] ="0";

    }

  }

 

  ///<summary>

  /// The 'Product' class

  ///</summary>

  classVehicle

  {

    privatestring _vehicleType;

    privateDictionary<string,string> _parts =

      newDictionary<string,string>();

 

    // Constructor

    public Vehicle(string vehicleType)

    {

      this._vehicleType = vehicleType;

    }

 

    // Indexer

    publicstring this[string key]

    {

      get {return _parts[key]; }

      set { _parts[key] =value; }

    }

 

    publicvoid Show()

    {

      Console.WriteLine("\n---------------------------");

      Console.WriteLine("Vehicle Type: {0}", _vehicleType);

      Console.WriteLine(" Frame : {0}", _parts["frame"]);

      Console.WriteLine(" Engine : {0}", _parts["engine"]);

      Console.WriteLine(" #Wheels: {0}", _parts["wheels"]);

      Console.WriteLine(" #Doors : {0}", _parts["doors"]);

    }

  }

}

 


Output
---------------------------
Vehicle Type: Scooter
 Frame  : Scooter Frame
 Engine : none
 #Wheels: 2
 #Doors : 0

---------------------------
Vehicle Type: Car
 Frame  : Car Frame
 Engine : 2500 cc
 #Wheels: 4
 #Doors : 4

---------------------------
Vehicle Type: MotorCycle
 Frame  : MotorCycle Frame
 Engine : 500 cc
 #Wheels: 2
 #Doors : 0


该文章来自: http://www.dofactory.com/Patterns/PatternBuilder.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值