C#设计模式之四建造者模式(Builder Pattern)【创建型】
一、引言 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 System.Collections.Generic; 3 System.Linq; 4 System.Text; 5 6 7 /// <summary> 8 /// 现在人们的生活水平都提高了,有钱了,我今天就以汽车组装为例子 9 每台汽车的组装过程都是一致的,所以我们使用同样的构建过程可以创建不同的表示(即可以组装成不同型号的汽车,不能像例子这样,一会别克,一会奥迪的) 10 组装汽车、电脑、手机、电视等等负责对象的这些场景都可以应用建造者模式来设计 11 </summary> 12 namespace 设计模式之建造者模式 13 { 14 15 客户类 16 17 class Customer 18 { 19 static void Main(string[] args) 20 { 21 Director director = new Director(); 22 Builder buickCarBuilder = BuickBuilder(); 23 Builder aoDiCarBuilder = 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 41 这个类型才是组装的,Construct方法里面的实现就是创建复杂对象固定算法的实现,该算法是固定的,或者说是相对稳定的 42 这个人当然就是老板了,也就是建造者模式中的指挥者 43 44 public Director 45 46 组装汽车 47 void Construct(Builder builder) 48 49 builder.BuildCarDoor(); 50 builder.BuildCarWheel(); 51 builder.BuildCarEngine(); 52 53 54 55 56 汽车类 57 58 sealed Car 59 60 汽车部件集合 61 private IList<string> parts = new List<string>(); 62 63 把单个部件添加到汽车部件集合中 64 void Add( part) 65 66 parts.Add(part); 67 68 69 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 82 抽象建造者,它定义了要创建什么部件和最后创建的结果,但是不是组装的的类型,切记 83 84 abstract Builder 85 86 创建车门 87 BuildCarDoor(); 88 创建车轮 89 BuildCarWheel(); 90 创建车引擎 91 BuildCarEngine(); 92 当然还有部件,大灯、方向盘等,这里就省略了 93 94 获得组装好的汽车 95 abstract Car GetCar(); 96 97 98 99 具体创建者,具体的车型的创建者,例如:别克 100 101 BuickBuilder : Builder 102 103 Car buickCar = Car(); 104 override BuildCarDoor() 105 106 buickCar.Add(Buick's Door107 108 109 BuildCarWheel() 110 111 buickCar.Add(Buick's Wheel112 113 114 BuildCarEngine() 115 116 buickCar.Add(Buick's Engine117 118 119 override Car GetCar() 120 121 return buickCar; 122 123 124 125 126 具体创建者,具体的车型的创建者,例如:奥迪 127 128 AoDiBuilder : Builder 129 130 Car aoDiCar = 131 132 133 aoDiCar.Add(Aodi's Door134 135 136 137 138 aoDiCar.Add(Aodi's Wheel139 140 141 142 143 aoDiCar.Add(Aodi's Engine144 145 146 147 148 aoDiCar; 149 150 151 } ? ?上面代码中都有详细的注释代码,这里就不过多解释。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – Rational Number struct的默认值
- [Vue CLI 3] @vue/cli-plugin-eslint 源码分析
- Swift创始人离开苹果这件事,影响没那么大
- oracle transport tablespace
- entity-framework – 在运行时注入/管理使用Entity Framewo
- c# – FluentValidation – 预验证/条件验证,无代码重复
- 通过 oracle-java8-installer 在ubuntu server 上安装java
- 正则表达式:“(^ |)”vs“(| ^)”
- postgresql数据库怎么更改其中一个数据库的拥有者?
- jaxp实现xslt转换示例