zoukankan      html  css  js  c++  java
  • 建造者(Builder)模式 *

    一、 建造者(Builder)模式

      建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

    二、 Builder模式的结构:

      建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

      具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

    • 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
    • 在建造过程完成后,提供产品的实例。

      指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

      产品(Product)角色:产品便是建造中的复杂对象。

      指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

     

         /// <summary>
        /// 建造者(Builder)模式
        /// 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,
        /// 从而可以使一个建造过程生成具有不同的内部表象的产品对象。
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            { 
                //创建 指导者 跟 建设者实例
                Shop shop = new Shop();
                VehicleBuilder mt = new MotorCycleBuilder();
                VehicleBuilder car = new CarBuilder();
    
                shop.Construct(mt);
                Vehicle vehicle = mt.Vehicle;
                vehicle.Show();
    
                shop.Construct(car);
                Vehicle vehicles = car.Vehicle;
                vehicles.Show();
    
                Console.ReadLine();
            }
        }
    
        /// <summary>
        /// 指导者
        /// </summary>
        public class Shop
        {
            // 方法
            public void Construct(VehicleBuilder vehicleBuilder)
            {
                vehicleBuilder.BuildFrame();
                vehicleBuilder.BuildEngine();
                vehicleBuilder.BuildWheels();
                vehicleBuilder.BuildDoors();
            }
        }
    
    
        /// <summary>
        /// 建造者 角色  VehicleBuilder 车辆建造者
        /// </summary>
        public abstract class VehicleBuilder
        {
            // Fields
            protected Vehicle vehicle;
    
            // 产品类型 属性
            public Vehicle Vehicle
            {
                get { return vehicle; }
            }
            // 方法
            abstract public void BuildFrame();
            abstract public void BuildEngine();
            abstract public void BuildWheels();
            abstract public void BuildDoors();
        }
    
    
        /// <summary>
        /// 具体 建造者  汽车(Car)
        /// </summary>
        public class CarBuilder : VehicleBuilder
        {
            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";
            }
        }
    
        /// <summary>
        ///  具体 建造者 摩托车(MotorCycle) 
        /// </summary>
        public class MotorCycleBuilder : VehicleBuilder
        {
          public  override  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";
            }
        }
    
        /// <summary>
        /// 产品
        /// </summary>
        public class Vehicle
        {
            private string type;
            private Hashtable parts = new Hashtable();
    
            // 构造函数
            public Vehicle(string type)
            {
                this.type = type;
            }
    
            // 索引
            public object this[string key]
            {
                get { return parts[key]; }
                set { parts[key] = value; }
            }
    
            // 方法
            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"]);
            }
    
        }

    三、 在什么情况下使用建造者模式

    以下情况应当使用建造者模式:

    1、 需要生成的产品对象有复杂的内部结构。
    2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
    3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

    使用建造者模式主要有以下效果:

    1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
    2、 每一个Builder都相对独立,而与其它的Builder无关。
    3、 模式所建造的最终产品更易于控制。

     

     

  • 相关阅读:
    python基础学习24----使用pymysql连接mysql
    HTML基本标签
    python基础学习20----线程
    MySQL基础操作
    python永久添加第三方模块,PYTHONPATH的设置
    MySQL压缩包zip安装
    汇编语言debug命令与指令机器码
    python基础学习23----IO模型(简)
    python基础学习22----协程
    python基础学习21----进程
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3687976.html
Copyright © 2011-2022 走看看