理解软件设计模式中的建造者模式

开发 项目管理
设计模式是很多程序员关注的焦点,今天我们就来介绍软件设计模式中的建造者模式。

  4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)

  产品:需要创建的对象产品

  具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配

  建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用

  指挥者:调用建造者抽象类以及其方法

  实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。

  类图:

  

  应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。

  分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,

EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。

  下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:

一、产品角色

  1. //产品  
  2.   classComputer  
  3. {privatestringm_CompName;privatestringm_MemorySize;privatestringm_DiskSize;///<summary>  
  4.   ///电脑名称///</summary>  
  5.   publicstringCompName  
  6.   {get{ returnm_CompName; }set{ m_CompName =value; }  
  7.   }///<summary>  
  8.   ///内存大小///</summary>  
  9.   publicstringMemorySize  
  10.   {get{ returnm_MemorySize; }set{ m_MemorySize =value; }  
  11.   }///<summary>  
  12.   ///硬盘大小///</summary>  
  13.   publicstringDiskSize  
  14.   {get{ returnm_DiskSize; }set{ m_DiskSize =value; }  
  15.   }///<summary>  
  16.   ///显示产品的信息///</summary>  
  17.   publicvoidShowComputerInfo()  
  18.   {  
  19.   Console.WriteLine("------------------------");  
  20.   Console.WriteLine("电脑名称:"+CompName);  
  21.   Console.WriteLine("内存大小:"+MemorySize);  
  22.   Console.WriteLine("硬盘大小:"+DiskSize);  
  23.   }  
  24.   } 

二、建造者角色

  1.   //建造者 定义建造产品的抽象方法和产品的引用  
  2.   abstractclassComputerBuilder  
  3.   {privateComputer computerInstance;///<summary>  
  4.   ///返回建立的电脑产品实例///</summary>  
  5.   publicComputer ComputerInstance  
  6.   {get{ returncomputerInstance; }set{ computerInstance=value; }  
  7.   }///<summary>  
  8.   ///创建电脑名称///</summary>  
  9.   abstractpublicvoidCreateCompName();///<summary>  
  10.   ///创建电脑内存///</summary>  
  11.   abstractpublicvoidCreateCompMemory();///<summary>  
  12.   ///创建电脑硬盘///</summary>  
  13.   abstractpublicvoidCreateCompDisk();  
  14.   } 

三、具体建造者角色

  1.   //具体建造者创建苹果电脑  
  2.   classAppleConcreteBuilder : ComputerBuilder  
  3.   {publicoverridevoidCreateCompName()  
  4.   {  
  5.   ComputerInstance =newComputer();  
  6.   ComputerInstance.CompName ="苹果电脑"}publicoverridevoidCreateCompMemory()  
  7.   {  
  8.   ComputerInstance.MemorySize ="4G"}publicoverridevoidCreateCompDisk()  
  9.   {  
  10.   ComputerInstance.DiskSize ="500G"}  
  11.   }//具体建造者创建戴尔电脑  
  12.   classDellConcreteBuilder : ComputerBuilder  
  13.   {publicoverridevoidCreateCompName()  
  14.   {  
  15.   ComputerInstance =newComputer();  
  16.   ComputerInstance.CompName ="戴尔电脑"}publicoverridevoidCreateCompMemory()  
  17.   {  
  18.   ComputerInstance.MemorySize ="2GB"}publicoverridevoidCreateCompDisk()  
  19.   {  
  20.   ComputerInstance.DiskSize ="320GB"}  
  21.   }//具体建造者创建惠普电脑  
  22.   classHpConcreteBuilder : ComputerBuilder  
  23.   {publicoverridevoidCreateCompName()  
  24.   {  
  25.   ComputerInstance =newComputer();  
  26.   ComputerInstance.CompName ="惠普电脑"}publicoverridevoidCreateCompMemory()  
  27.   {  
  28.   ComputerInstance.MemorySize ="1GB"}publicoverridevoidCreateCompDisk()  
  29.   {  
  30.   ComputerInstance.DiskSize ="160GB"}  
  31.   }//具体建造者创建IBM电脑  
  32.   classIBMConcreteBuilder : ComputerBuilder  
  33.   {publicoverridevoidCreateCompName()  
  34.   {  
  35.   ComputerInstance =newComputer();  
  36.   ComputerInstance.CompName ="IBM电脑"}publicoverridevoidCreateCompMemory()  
  37.   {  
  38.   ComputerInstance.MemorySize ="2G"}publicoverridevoidCreateCompDisk()  
  39.   {  
  40.   ComputerInstance.DiskSize ="1000G"}  
  41.   } 

四、指挥者角色

  1.   //指挥者  
  2.   classCreateDirector  
  3.   {///<summary>  
  4.   ///调用建造者抽象方法以生产产品///</summary>  
  5.   ///<param name="compBuilder"></param>  
  6.   publicvoidCreateComputer(ComputerBuilder compBuilder)  
  7.   {  
  8.   compBuilder.CreateCompName();  
  9.   compBuilder.CreateCompMemory();  
  10.   compBuilder.CreateCompDisk();  
  11.   }  
  12.  } 

如需源码请点击 BuilderPattern.zip下载。

原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html

【编辑推荐】

  1. 新手软件项目经理该如何入门
  2. 项目经理的力量应该从哪里来?
  3. 当你从程序员变为项目经理
  4. 软件测试项目为什么会失败
  5. 项目管理之CVS与SVN日常使用总结

 

责任编辑:彭凡 来源: 博客园
相关推荐

2019-08-12 14:45:50

软件设计Java

2021-04-14 09:02:22

模式 设计建造者

2020-10-20 13:33:00

建造者模式

2021-10-26 00:21:19

设计模式建造者

2021-01-21 05:34:14

设计模式建造者

2024-02-19 08:38:34

建造者模式Android设计模式

2010-08-11 09:15:07

设计模式Python

2022-09-19 06:25:14

设计模式GoF

2022-11-01 15:25:01

构建者模式Go 语言

2012-12-25 09:38:41

JavaScript设计模式

2023-10-19 13:43:00

设计模式软件设计

2013-06-07 11:31:36

面向对象设计模式

2021-06-10 19:09:05

模式代码建造者

2021-05-11 08:54:59

建造者模式设计

2011-07-21 14:33:02

设计模式

2020-11-05 09:38:07

中介者模式

2021-07-28 10:02:54

建造者模式代码

2023-05-26 08:41:23

模式Go设计模式

2020-12-01 07:16:05

重学设计模式

2020-10-26 08:45:39

观察者模式
点赞
收藏

51CTO技术栈公众号