该类型的名字就是System.Text.StringBuilder(存在mscorlib.dll程序集中)

时间:2022-01-03 05:52:25

原文:C#设计模式之四建造者模式(Builder Pattern)【创建型】

一、引言

  今天我们要讲讲Builder模式,也就是建造者模式,固然也有叫生成器模式的,英文名称是Builder Pattern。在现实生活中,我们经常会遇到一些组成对照庞大的物品,好比:电脑,它就是一个庞大的物品,它主要是由CPU、主板、硬盘、显卡、机箱等组装而成的。手机固然也是庞大物品,由主板,各类芯片,RAM 和ROM  摄像头之类的对象构成。但是无论是电脑还是手机,他们的组装过程是固定的,就拿手机来说,组装流水线是固定的,不乱的,但是把差此外主板和其他组件组装在一起就会出产出差别型号的手机。那么在软件系统中是不是也会存在这样的东西呢?答案是必定的。在软件系统中我们也会遇到类似的庞大东西,并且这个庞大东西的各个部分凭据必然的算法组合在一起,此时该东西的创建事情就可以使用Builder模式了,下面我就来详细看看这个模式吧。

二、建造者模式的详细介绍

2.1、动机(Motivate)

  在软件系统中,有时候面临着“一个庞大东西”的创建事情,其凡是由各个部分的子东西用必然的算法组成;由于需求的变革,这个庞大东西的各个部分经常面临着剧烈的变革,但是将它们组合在一起的算法却相对不变。如何应对这种变革?如何供给一种“封装机制”来断绝出“庞大东西的各个部分”的变革,从而连结系统中的“不变构建算法”不跟着需求转变而转变?

2.2、意图(Intent)

  将一个庞大东西的构建与其暗示相疏散,使得同样的构建过程可以创建差此外暗示。                   ——《设计模式》GoF

2.3、布局图(Structure)
   

该类型的名字就是System.Text.StringBuilder(存在mscorlib.dll程序集中)


2.4、模式的构成

  (1)、抽象建造者角色(Builder):为创建一个Product东西的各个部件指定抽象接口,以规范产品东西的各个构成身分的建造。一般而言,此角色规定要实现庞大东西的哪些部分的创建,并不涉及具体的东西部件的创建。

  (2)、具体建造者(ConcreteBuilder)

     1)实现Builder的接口以结构和装配该产品的各个部件。即实现抽象建造者角色Builder的要领。

     2)界说并明确它所创建的暗示,即针对差此外商业逻辑,具体化庞大东西的各部分的创建

     3) 供给一个检索产品的接口

     4) 结构一个使用Builder接口的东西即在指导者的挪用下创建产品实例

  (3)、指导者(Director):挪用具体建造者角色以创建产品东西的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者东西。它只卖力保证东西各部分完整创建或按某种挨次创建。

  (4)、产品角色(Product):建造中的庞大东西。它要包罗那些界说组件的类,包孕将这些组件装配成产品的接口。

2.5 建筑者模式的具体实现

  此刻人们生活程度都提高了,家家都有了家庭轿车,那今天我们就以汽车组装为例来说明Builder模式的实现。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 7 /// <summary> 8 /// 此刻人们的生活程度都提高了,有钱了,我今天就以汽车组装为例子 9 /// 每台汽车的组装过程都是一致的,所以我们使用同样的构建过程可以创建差此外暗示(即可以组装成差别型号的汽车,不能像例子这样,一会别克,,一会奥迪的) 10 /// 组装汽车、电脑、手机、电视等等卖力东西的这些场景都可以应用建造者模式来设计 11 /// </summary> 12 namespace 设计模式之建造者模式 13 { 14 /// <summary> 15 /// 客户类 16 /// </summary> 17 class Customer 18 { 19 static void Main(string[] args) 20 { 21 Director director = new Director(); 22 Builder buickCarBuilder = new BuickBuilder(); 23 Builder aoDiCarBuilder = new AoDiBuilder(); 24 25 director.Construct(buickCarBuilder); 26 27 //组装完成,我来驾驶别克了 28 Car buickCar = buickCarBuilder.GetCar(); 29 buickCar.Show(); 30 31 // 我老婆就要奥迪了,她对照喜欢大品牌 32 director.Construct(aoDiCarBuilder); 33 Car aoDiCar = aoDiCarBuilder.GetCar(); 34 aoDiCar.Show(); 35 36 Console.Read(); 37 } 38 } 39 40 /// <summary> 41 /// 这个类型才是组装的,Construct要领里面的实现就是创建庞大东西固定算法的实现,该算法是固定的,或者说是相对不变的 42 /// 这小我私家固然就是老板了,也就是建造者模式中的指挥者 43 /// </summary> 44 public class Director 45 { 46 // 组装汽车 47 public void Construct(Builder builder) 48 { 49 builder.BuildCarDoor(); 50 builder.BuildCarWheel(); 51 builder.BuildCarEngine(); 52 } 53 } 54 55 /// <summary> 56 /// 汽车类 57 /// </summary> 58 public sealed class Car 59 { 60 // 汽车部件调集 61 private IList<string> parts = new List<string>(); 62 63 // 把单个部件添加到汽车部件调集中 64 public void Add(string part) 65 { 66 parts.Add(part); 67 } 68 69 public void Show() 70 { 71 Console.WriteLine("汽车开始在组装......."); 72 foreach (string part in parts) 73 { 74 Console.WriteLine("组件" + part + "已装好"); 75 } 76 77 Console.WriteLine("汽车组装好了"); 78 } 79 } 80 81 /// <summary> 82 /// 抽象建造者,它界说了要创建什么部件和最后创建的功效,但是不是组装的的类型,切记 83 /// </summary> 84 public abstract class Builder 85 { 86 // 创建车门 87 public abstract void BuildCarDoor(); 88 // 创建车轮 89 public abstract void BuildCarWheel(); 90 //创建车引擎 91 public abstract void BuildCarEngine(); 92 // 固然还有部件,大灯、标的目的盘等,这里就省略了 93 94 // 获得组装好的汽车 95 public abstract Car GetCar(); 96 } 97 98 /// <summary> 99 /// 具体创建者,具体的车型的创建者,例如:别克 100 /// </summary> 101 public sealed class BuickBuilder : Builder 102 { 103 Car buickCar = new Car(); 104 public override void BuildCarDoor() 105 { 106 buickCar.Add("Buick‘s Door"); 107 } 108 109 public override void BuildCarWheel() 110 { 111 buickCar.Add("Buick‘s Wheel"); 112 } 113 114 public override void BuildCarEngine() 115 { 116 buickCar.Add("Buick‘s Engine"); 117 } 118 119 public override Car GetCar() 120 { 121 return buickCar; 122 } 123 } 124 125 /// <summary> 126 /// 具体创建者,具体的车型的创建者,例如:奥迪 127 /// </summary> 128 public sealed class AoDiBuilder : Builder 129 { 130 Car aoDiCar = new Car(); 131 public override void BuildCarDoor() 132 { 133 aoDiCar.Add("Aodi‘s Door"); 134 } 135 136 public override void BuildCarWheel() 137 { 138 aoDiCar.Add("Aodi‘s Wheel"); 139 } 140 141 public override void BuildCarEngine() 142 { 143 aoDiCar.Add("Aodi‘s Engine"); 144 } 145 146 public override Car GetCar() 147 { 148 return aoDiCar; 149 } 150 } 151 }