设计模式实例与代码: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"]); } }}
- 设计模式实例与代码:Builder模式
- [设计模式](四):建造者模式(Builder)与原型模式(Prototype)[含Kotlin深克隆实例代码]
- 设计模式与实例代码:Facade模式
- 设计模式与实例代码:Adapter模式
- 设计模式与实例代码:Strategy模式
- 设计模式与实例代码:Decorator模式
- 设计模式与实例代码:Bridge模式
- 设计模式与实例代码:Observer模式
- 设计模式实例与代码:Prototype模式
- 设计模式与实例代码:Composite模式
- 设计模式与实例代码:Visitor模式
- 设计模式与实例代码:Proxy模式
- 设计模式之Builder模式实例
- Builder 设计模式 代码示例
- 设计模式:Builder模式
- 设计模式 -- BUILDER模式
- 【设计模式】Builder模式
- 设计模式-Builder模式
- C#操作数据库基础实例《密码管理工具》
- Tomcat 负载均衡
- CSDN第二次实训的第二天
- 自己写PHP扩展之创建一个普通变量
- 深入浅出分析C#接口的作用
- 设计模式实例与代码:Builder模式
- C#学习日志一(常量和变量)
- Oracle数据库中删除两表中相同数据
- 读取磁盘图片,下载方式
- Oracle的优化器(Optimizer)
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- c# 自定义类库与自定义控件
- 风雨十年:一个老程序员的心里话!
- 划分用户故事(user-story)的原则