建造者模式(Builder Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。

建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。

角色:

1、抽象建造者(Builder)

给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建;

2、具体建造者(Concrete Builder)

实现建造者接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例;

3、指导者(Director)

调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;

4、产品类(Product)

需要创建的具体的复杂对象。

示例:

命名空间BuilderPattern中包含Vehicle机动车类充当产品类,Builder基类为抽象建造者,东风悦达Yuedakia类、大众汽车Volkswagen类、特斯拉Tesla类。另外包含1个机动车扩展类和1个指导者。本示例向大家演示3个不同的汽车厂商在生产比较复杂的汽车时所采用的策略。

namespace BuilderPattern
public abstract class Builder {protected Vehicle _product = new Vehicle();public abstract void BuildCarframe();public abstract void BuildWheel();public abstract void BuildDoor();public abstract void BuildApparatus();public abstract void BuildColor();public virtual Vehicle GetResult() {return _product;}}

建造者基类Builder,定义生产不同汽车部位的接口并在内部维持对机动车的引用。

public class Tesla : Builder {public override void BuildCarframe() {_product.Carframe = "ZZ32093M3485C1356";}public override void BuildWheel() {_product.Wheel = 4;}public override void BuildDoor() {_product.Door = 5;}public override void BuildApparatus() {_product.Apparatus = "Model X";}public override void BuildColor() {_product.Color = Color.Red;}}

具体建造者特斯拉Tesla类,实现抽象建造者Builder的接口。

public class Volkswagen : Builder {public override void BuildCarframe() {_product.Carframe = "VS89362P1903C9852";}public override void BuildWheel() {_product.Wheel = 4;}public override void BuildDoor() {_product.Door = 4;}public override void BuildApparatus() {_product.Apparatus = "Skoda";}public override void BuildColor() {_product.Color = Color.Blue;}}

具体建造者大众汽车Volkswagen类,实现抽象建造者Builder的接口。

public class Yuedakia : Builder {public override void BuildCarframe() {_product.Carframe = "YK9391J0231L30D32";}public override void BuildWheel() {_product.Wheel = 4;}public override void BuildDoor() {_product.Door = 4;}public override void BuildApparatus() {_product.Apparatus = "Kia K3";}public override void BuildColor() {_product.Color = Color.Wheat;}}

具体建造者东风悦达Yuedakia类,实现抽象建造者Builder的接口。

public class Vehicle {public string Carframe { get; set; }public int Wheel { get; set; }public int Door { get; set; }public string Apparatus { get; set; }public Color Color { get; set; }public void Print() {Console.WriteLine($"{this.VehicleInfo()}");}}

机动车Vehicle类,这是我们通过建造者模式所要创建的复杂对象。

public class Director {public void Construct(Builder builder) {builder.BuildCarframe();builder.BuildWheel();builder.BuildDoor();builder.BuildApparatus();builder.BuildColor();}}

这是指导类Director,它负责对象的创建过程。

public static class Extentions {public static string VehicleInfo(this Vehicle vehicle) {var type = vehicle.GetType();var properties = type.GetProperties();var result = string.Empty;foreach (var prop in properties) {result +=$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";}return result;}}

一个扩展类,方便演示过程中打印出相关信息。

public class Program {private static Director _director = null;private static List<Builder> _builders = null;private static Vehicle _vehicle = null;public static void Main(string[] args) {_director = new Director();_vehicle = new Vehicle();_builders = new List<Builder>() {new Tesla(),new Volkswagen(),new Yuedakia()};foreach (var builder in _builders) {_director.Construct(builder);_vehicle = builder.GetResult();_vehicle.Print();}Console.ReadKey();}}

以上是调用方的代码,分别维持对指导者、建造者和机动车的引用,接下来我们创建了3辆汽车,特斯拉的Model X、大众汽车的Skoda和东风悦达的Kia K3。以下是这个案例的输出结果:

Carframe:ZZ32093M3485C1356
Wheel:4
Door:5
Apparatus:Model X
Color:Color [Red]Carframe:VS89362P1903C9852
Wheel:4
Door:4
Apparatus:Skoda
Color:Color [Blue]Carframe:YK9391J0231L30D32
Wheel:4
Door:4
Apparatus:Kia K3
Color:Color [Wheat]

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。

1、易于解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品;
2、易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;
3、易于拓展,增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则”。

缺点:

1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;
2、如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制;
3、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

使用场景:

1、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

C#设计模式之3-建造者模式相关推荐

  1. 设计模式之路 | 建造者模式

    模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式.它是将一个复杂的对象分解为多个简单的对象 ...

  2. 设计模式系列之建造者模式构建实体类

    设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...

  3. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

    建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种. Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过 ...

  4. Java 设计模式情景分析——建造者模式

    当我们遇到类似汽车的装配,需要车轮.方向盘.发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展 ...

  5. 设计模式二:建造者模式

    建造者模式 想要创建一个由多个部分构成的对象,而且他的构成需要一步接一步地完成.只有当各个部分都创建好,这个对象才是完整的.这时就需要建造者模式 建造者设计模式:将一个复杂对象的构造过程与其表现分离, ...

  6. Java设计模式10,建造者模式

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

  7. 【设计模式自习室】建造者模式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该设计模式的详细介绍,包括: 引子,意图(大白话解释) 类图,时序图(理论规范) 该模式的代码示例: ...

  8. 设计模式 之美 -- 建造者模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C语言实现 C++实现 4. 缺点 1. 解决问题 描述如下场景: 类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的 ...

  9. 设计模式入门:建造者模式

    UML类图 建造者模式 代码示例 Product /*** 表示具体的产品,由多个部件组成*/ public class Product {/*** 存放产品每个部件的集合*/private List ...

  10. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

最新文章

  1. 课堂上的社死现场...
  2. Linux中查看各文件夹大小(扫盘)
  3. Pandas数据清洗工具箱
  4. [Android Pro] ant 编译android工程
  5. 客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...
  6. 小小的 likely 背后却大有玄机!
  7. 炫酷超漂亮辅助网站源码
  8. ym—— Android网络框架Volley(终极篇)
  9. delphi 多个checkbox只能勾选一个_CAD加选无效?不可连续选择多个对象?按下这个键就正常了...
  10. lua定时器与定时任务的接口设计
  11. Android 修改字体,跳不过的 Typeface
  12. python文本自动伪原创_现在有哪些好用的伪原创工具?
  13. reimage许可证密钥_思科 ASA 和 Firepower 威胁防御重新映像指南
  14. ipad端网页屏幕变小了
  15. 推流式搅拌器选型功率计算方法_不同池形中推流搅拌器功率消耗的数值模拟
  16. 法外之徒第一季/全集Braquo迅雷下载
  17. Revit建模中快速局部平面操作,一键搞定!
  18. 参数化建模类毕业论文文献有哪些?
  19. 牛客 古老的牛市,遗迹的天梯 dp
  20. 背锅侠?程序出现bug是测试/开发工程师水平有限导致的?我只是个搬砖的......

热门文章

  1. 在终端/命令行下打开文件浏览器窗口--Win cmd Ubuntu terminal
  2. 【C++面向对象】类的数据成员:绑定、布局和存取
  3. 获取随机数的方式Random类对象的方法 java 0913
  4. 11-mysql-查询进阶六-多表连接查询-自关联查询-练习题
  5. python-基础-代码备注与变量命名方法
  6. centos 7 firewalld 设置
  7. 通过Etcd+Confd自动管理Haproxy(多站点)
  8. MapReduce编程实践之自定义数据类型
  9. 1197: [HNOI2006]花仙子的魔法
  10. MySQL怎样存储IP地址