当前位置:编程学习 > asp >>

步步为营 .NET 设计模式学习笔记 十、Builder(建造者模式)

概述 

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。

本文通过现实汽车生产中的例子,来诠释建造者模式。

意图

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

<Design Pattern>Builder模型图

通俗讲解:Builder模式的理解

建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

  • 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
  • 在建造过程完成后,提易做图品的实例。

指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色:产品便是建造中的复杂对象。

指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。


简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高), 于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
就象国内好多企业上erp一样,上erp,首先得找软件公司呀,找到软件公司后,软件公司说,我只知道怎么写软件,就知道怎么实现,不清楚整个erp的流程。好,那我们还得找一个咨询公司,好,找到德勤了,德勤说好,我要软件怎么做,软件公司怎么做,我就能保证软件能为你们提供erp系统了。

示例用例图:

汽车的生产其实可以看作是一个建造者模式,大众生产Audi和Satana两种轿车,我们用例设计如下:

image

代码设计:

先创建 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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,