步步为营 .NET 设计模式学习笔记 十、Builder(建造者模式)
概述
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
本文通过现实汽车生产中的例子,来诠释建造者模式。
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
<Design Pattern>Builder模型图
通俗讲解:Builder模式的理解
建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:
- 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
- 在建造过程完成后,提易做图品的实例。
指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
产品(Product)角色:产品便是建造中的复杂对象。
指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高), 于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
就象国内好多企业上erp一样,上erp,首先得找软件公司呀,找到软件公司后,软件公司说,我只知道怎么写软件,就知道怎么实现,不清楚整个erp的流程。好,那我们还得找一个咨询公司,好,找到德勤了,德勤说好,我要软件怎么做,软件公司怎么做,我就能保证软件能为你们提供erp系统了。
示例用例图:
汽车的生产其实可以看作是一个建造者模式,大众生产Audi和Satana两种轿车,我们用例设计如下:
代码设计:
先创建 Car.cs:
01 public class Car
02 {
03 private string engine;
04 public string Engine
05 {
06 get { return engine; }
07 set { engine = value; }
08 }
09 private string gearing;
10 public string Gearing
11 {
12 get { return gearing; }
13 set { gearing = value; }
14 }
15 private string brake;
16 public string Brake
17 {
18 get { return brake; }
19 set { brake = value; }
20 }
21
22 public string ShowInfo()
23 {
24 StringBuilder strBuilder = new StringBuilder();
25 strBuilder.AppendLine("轿车配置如下:");
26 strBuilder.AppendFormat("发动机是:{0} ", Engine);
27 strBuilder.AppendFormat("传动系是:{0} ", Gearing);
28 strBuilder.AppendFormat("制动系是:{0} ", Brake);
29 return strBuilder.ToString();
30 }
31
32 }
然后创建BuildCar.cs:
view sourceprint?01 public abstract class BuildCar
02 {
03 private string name;
04 public string Name
05 {
06 get { return name; }
07 set { name = value; }
08 }
09 private Car newCar;
10 public Car NewCar
11 {
12 get { return newCar; }
13 set { newCar = value; }
14 }
15
16 public BuildCar()
17 {
18 newCar = new Car();
19 }
20 public abstract void BuildEngine();
21 public abstract void BuildGearing();
22 public abstract void BuildBrake();
23 }
再创建Audi.cs:
view sourceprint?01 public class Audi:BuildCar
02 {
03 public override void BuildEngine()
04 {
05 NewCar.Engine = "V型12缸发动机";
06 }
07
08 public override void BuildGearing()
09 {
10 NewCar.Gearing = "四轮驱动(4WD)";
11 }
12
13 public override void BuildBrake()
14 {
15 NewCar.Brake = "电磁式";
16 }
17 public Audi()
18 {
19 Name = "Audi A8";
20 }
21 }
再创建Satana.cs:
view sourceprint?01 publi
补充:Web开发 , ASP.Net ,