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