C#设计模式系列:建造者模式(Builder)
1 建造者模式简介
1.1 定义
建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
1.2 使用频率
中低
2 建造者模式结构
2.1 结构图

2.2 参与者
建造者模式参与者:
◊ Builder:为创建一个Product对象的各个部件指定抽象接口;
◊ ConcreteBuilder
° 实现Builder的接口以构造和装配该产品的各个部件
° 定义并明确它所创建的表示
° 提供一个检索Product的接口
◊ Director:构造一个使用Builder接口的对象;
◊ Product
° 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程
° 包含定义组成部件的类,包括将这些部件装配成最终产品的接口
在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。
3 建造者模式结构实现

Product.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class Product
{
private List<string> _parts = new List<string>(); public void Add(string part)
{
_parts.Add(part);
} public void Show()
{
Console.WriteLine("Product Parts");
foreach (string part in _parts)
{
Console.WriteLine(part);
}
}
}
}
Builder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
}
ConcreteBuilder1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class ConcreteBuilder1 : Builder
{
private Product _product = new Product(); public override void BuildPartA()
{
_product.Add("PartA");
} public override void BuildPartB()
{
_product.Add("PartB");
} public override Product GetResult()
{
return _product;
}
}
}
ConcreteBuilder2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class ConcreteBuilder2 : Builder
{
private Product _product = new Product(); public override void BuildPartA()
{
_product.Add("PartX");
} public override void BuildPartB()
{
_product.Add("PartY");
} public override Product GetResult()
{
return _product;
}
}
}
Director.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Structural
{
public class Director
{
/// <summary>
/// Builder uses a complex series of steps
/// </summary>
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.BuilderPattern.Structural; namespace DesignPatterns.BuilderPattern
{
class Program
{
static void Main(string[] args)
{
// 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();
}
}
}
运行输出:
Product Parts
PartA
PartB
Product Parts
PartX
PartY
请按任意键继续. . .
4、建造者模式实践应用

Vehicle.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
/// <summary>
/// The 'Product' class
/// </summary>
public class Vehicle
{
private string _vehicleType;
private Dictionary<string, string> _parts = new Dictionary<string, string>(); /// <summary>
/// Constructor
/// </summary>
public Vehicle(string vehicleType)
{
this._vehicleType = vehicleType;
} /// <summary>
/// Indexer
/// </summary>
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"]);
}
}
}
VehicleBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
/// <summary>
/// The 'Builder' abstract class
/// </summary>
public 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();
}
}
MotorCycleBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public 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"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
CarBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public 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"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
ScooterBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class ScooterBuilder : VehicleBuilder
{
public ScooterBuilder()
{
vehicle = new Vehicle("Scooter");
} public override void BuildFrame()
{
vehicle["frame"] = "Scooter Frame";
} public override void BuildEngine()
{
vehicle["engine"] = "50 cc";
} public override void BuildWheels()
{
vehicle["wheels"] = "";
} public override void BuildDoors()
{
vehicle["doors"] = "";
}
}
}
Shop.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.BuilderPattern.Practical
{
public class Shop
{
public void Construct(VehicleBuilder vehicleBuilder)
{
vehicleBuilder.BuildFrame();
vehicleBuilder.BuildEngine();
vehicleBuilder.BuildWheels();
vehicleBuilder.BuildDoors();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.BuilderPattern.Practical; namespace DesignPatterns.BuilderPattern
{
class Program
{
static void Main(string[] args)
{
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();
}
}
}
运行输出:
---------------------------
Vehicle Type: Scooter
Frame : Scooter Frame
Engine : cc
#Wheels:
#Doors : ---------------------------
Vehicle Type: Car
Frame : Car Frame
Engine : cc
#Wheels:
#Doors : ---------------------------
Vehicle Type: MotorCycle
Frame : MotorCycle Frame
Engine : cc
#Wheels:
#Doors :
请按任意键继续. . .
5 建造者模式应用分析
建造者模式适用情形:
◊ 需要生成的产品对象有复杂的内部结构
◊ 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
◊ 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到
建造者模式特点:
◊ 建造者模式的使用使得产品的内部表对象可以独立地变化。使用建造者模式可以使客户不必知道产品内部组成的细节
◊ 每一个Builder都相对独立,而与其他Builder无关
◊ 可使对构造过程更加精细控制
◊ 将构建代码和表示代码分开
◊ 建造者模式的缺点在于难于应付分步骤构建算法的需求变动
C#设计模式系列:建造者模式(Builder)的更多相关文章
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 设计模式之建造者模式——Builder
一.概述 Builder模式,中文名为建造者模式,又名生成器模式.构建者模式等,是创建型设计模式之一.用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.适用性: 对象 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- 设计模式之建造者模式(Builder)
建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...
- 设计模式之建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 【UE4 设计模式】建造者模式 Builder Pattern
概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...
- PHP设计模式系列 - 建造者模式
什么是建造者模式 建造者模式主要是为了消除其它对象复杂的创建过程. 设计场景 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,金钱等信息,才能获得用户具体的信息结果. 创建一个U ...
随机推荐
- 页面制作之HTML
标签 常用属性 id class style title - <a href ="/" title="收藏">收藏</a>(用于hove ...
- 获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息
在iOS7之前, 可以方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 来获取设备的UDID,但是在iOS7之后这个方法不再适用. 你可以用[[UID ...
- tessnet2.Tesseract Init程序退出问题解决
1.检查语言包与引用库版本是否一致.2.0需要使用2.0的语言包.(http://www.pixel-technology.com/freeware/tessnet2/) 2.是否安装过3.0,安装中 ...
- 怎么将java web 项目导入idea 中
1.将 java web 项目导 入idea 中, 显示 然后进行 Configure 配置. 2. 点击 open module settings. 3. 4. 选择jar包. 5. 6. 配置to ...
- -[NSNull countByEnumeratingWithState:objects:count:]:
当数组为空时遍历数组容易出这样的问题, -[NSNull countByEnumeratingWithState:objects:count:]: unrecognized selector sent ...
- SQL存储过程基础(从基础开始学,加油!)
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- Java实现列出目录下所有文件和文件夹
package com.filetest; import java.io.File; import java.util.Scanner; public class fileview { public ...
- Pyserial操作串口
pySerial 介绍 封装了串口通讯模块,支持Linux.Windows.BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mon ...
- STOMP协议介绍
STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息 ...
- Mono 3.2 上跑NUnit测试
NUnit是一款堪与JUnit齐名的开源的回归测试框架,供.net开发人员做单元测试之用,可以从www.nunit.org网站上免费获得,最新版本是2.5.Mono 3.2 源码安装的,在/usr/b ...