设计模式实例与代码:Builder模式

来源:互联网 发布:mac充电器灯不亮 编辑:程序博客网 时间:2024/05/17 03:57


意图/定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
问题:面对复杂对象的创建工作,通常各个部分对象用一定的算法构成,但复杂对象的各个部分经常面临着剧烈的变化,而将它们组合在一起的算法相对稳定 
解决方案:将各个部分的创建独立封装起来
参与者与协作者:抽象的Builder类,为导向者可能要求创建的每一个构件(Part)定义一个操作(接口)。这些操作缺省情况下什么都不做。一个ConcreteBuilder类对它所感兴趣的构建重定义这些操作。每个ConcreteBuilder包含了创建一个特定产品所有部分的代码,但具体的装配过程在Director中定义。
效果:使得复杂对象的“组装过程”与“部件的构造方式”相分离,二者可以独立变化。单纯的Builder模式中,“不同Product类型”的组成部件之间,不能进行组合或替换
实现:

相关模式[DP]

Abstract Factory与Builder相似,因为它可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象(简单的或复杂的)。Builder是最后一步返回产品,而Abstract Factory是立即返回产品。Composite通常是用Builder生成的。

从类图上观察到其中间部分类似于模板方法和策略模式的组合,将某些操作延迟到子类中执行,但builder模式与模板方法实际没有任何关系,Builder基类中并没有定义任何算法步骤相关的内容,装配过程是在Director类完成的。



示例代码:下面代码以制造汽车和摩托车的过程为例,二者的制造过程都可以抽象为创建车身、创建引擎、创建轮子、创建门,但汽车和摩托二者每一步的创建细节又不相同。

using System;using System.Collections.Generic;namespace Builder{    /// <summary>    /// MainApp startup class for Real-World    /// Builder Design Pattern.    /// </summary>    public class MainApp    {        /// <summary>        /// Entry point into console application.        /// </summary>        public static void Main()        {            VehicleBuilder builder;            // Create shop with vehicle builders            Shop shop = new Shop();            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>    class Shop    {        // Builder uses a complex series of steps        public void Construct(VehicleBuilder vehicleBuilder)        {            vehicleBuilder.BuildFrame();            vehicleBuilder.BuildEngine();            vehicleBuilder.BuildWheels();            vehicleBuilder.BuildDoors();        }    }    /// <summary>    /// The 'Builder' abstract class    /// </summary>    abstract class VehicleBuilder    {        protected Vehicle vehicle;        // Gets vehicle instance        public Vehicle Vehicle        {            get { return vehicle; }        }        // Abstract build methods        public abstract void BuildFrame();        public abstract void BuildEngine();        public abstract void BuildWheels();        public abstract void BuildDoors();    }    /// <summary>    /// The 'ConcreteBuilder1' class    /// </summary>    class MotorCycleBuilder : VehicleBuilder    {        public MotorCycleBuilder()        {            vehicle = new Vehicle("MotorCycle");        }        public override void BuildFrame()        {            vehicle["frame"] = "MotorCycle Frame";        }        public override void BuildEngine()        {            vehicle["engine"] = "500 cc";        }        public override void BuildWheels()        {            vehicle["wheels"] = "2";        }        public override void BuildDoors()        {            vehicle["doors"] = "0";        }    }    /// <summary>    /// The 'ConcreteBuilder2' class    /// </summary>    class CarBuilder : VehicleBuilder    {        public CarBuilder()        {            vehicle = new Vehicle("Car");        }        public override void BuildFrame()        {            vehicle["frame"] = "Car Frame";        }        public override void BuildEngine()        {            vehicle["engine"] = "2500 cc";        }        public override void BuildWheels()        {            vehicle["wheels"] = "4";        }        public override void BuildDoors()        {            vehicle["doors"] = "4";        }    }      /// <summary>    /// The 'Product' class    /// </summary>    class Vehicle    {        private string _vehicleType;        private Dictionary<string, string> _parts =          new Dictionary<string, string>();        // Constructor        public Vehicle(string vehicleType)        {            this._vehicleType = vehicleType;        }        // Indexer        public string this[string key]        {            get { return _parts[key]; }            set { _parts[key] = value; }        }        public void 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"]);        }    }}



原创粉丝点击