极速理解设计模式系列:1.建造者模式(Builder Pattern)

简介:

    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. class Computer 
  3. private string m_CompName; 
  4. private string m_MemorySize; 
  5. private string m_DiskSize; 
  6.  
  7. /// <summary> 
  8. /// 电脑名称 
  9. /// </summary> 
  10. public string CompName 
  11. get { return m_CompName; } 
  12. set { m_CompName = value; } 
  13.  
  14. /// <summary> 
  15. /// 内存大小 
  16. /// </summary> 
  17. public string MemorySize 
  18. get { return m_MemorySize; } 
  19. set { m_MemorySize = value; } 
  20.  
  21. /// <summary> 
  22. /// 硬盘大小 
  23. /// </summary> 
  24. public string DiskSize 
  25. get { return m_DiskSize; } 
  26. set { m_DiskSize = value; } 
  27. /// <summary> 
  28. /// 显示产品的信息 
  29. /// </summary> 
  30. public void ShowComputerInfo() 
  31. Console.WriteLine("------------------------"); 
  32. Console.WriteLine("电脑名称:" + CompName); 
  33. Console.WriteLine("内存大小:" + MemorySize); 
  34. Console.WriteLine("硬盘大小:" + DiskSize); 

        二、建造者角色

 

 
  1. //建造者 定义建造产品的抽象方法和产品的引用 
  2. abstract class ComputerBuilder 
  3. private Computer computerInstance; 
  4.  
  5. /// <summary> 
  6. /// 返回建立的电脑产品实例 
  7. /// </summary> 
  8. public Computer ComputerInstance 
  9. get { return computerInstance; } 
  10. set { computerInstance=value; } 
  11.  
  12. /// <summary> 
  13. /// 创建电脑名称 
  14. /// </summary> 
  15. abstract public void CreateCompName(); 
  16.  
  17. /// <summary> 
  18. /// 创建电脑内存 
  19. /// </summary> 
  20. abstract public void CreateCompMemory(); 
  21.  
  22. /// <summary> 
  23. /// 创建电脑硬盘 
  24. /// </summary> 
  25. abstract public void CreateCompDisk(); 
  26.  

        三、具体建造者角色

 

 
  1. //具体建造者创建苹果电脑 
  2. class AppleConcreteBuilder : ComputerBuilder 
  3.  
  4. public override void CreateCompName() 
  5. ComputerInstance = new Computer(); 
  6. ComputerInstance.CompName = "苹果电脑"
  7.  
  8. public override void CreateCompMemory() 
  9. ComputerInstance.MemorySize = "4G"
  10.  
  11. public override void CreateCompDisk() 
  12. ComputerInstance.DiskSize = "500G"
  13.  
  14. //具体建造者创建戴尔电脑 
  15. class DellConcreteBuilder : ComputerBuilder 
  16.  
  17. public override void CreateCompName() 
  18. ComputerInstance = new Computer(); 
  19. ComputerInstance.CompName = "戴尔电脑"
  20.  
  21. public override void CreateCompMemory() 
  22. ComputerInstance.MemorySize = "2GB"
  23.  
  24. public override void CreateCompDisk() 
  25. ComputerInstance.DiskSize = "320GB"
  26.  
  27. //具体建造者创建惠普电脑 
  28. class HpConcreteBuilder : ComputerBuilder 
  29.  
  30. public override void CreateCompName() 
  31. ComputerInstance = new Computer(); 
  32. ComputerInstance.CompName = "惠普电脑"
  33.  
  34. public override void CreateCompMemory() 
  35. ComputerInstance.MemorySize = "1GB"
  36.  
  37. public override void CreateCompDisk() 
  38. ComputerInstance.DiskSize = "160GB"
  39.  
  40. //具体建造者创建IBM电脑 
  41. class IBMConcreteBuilder : ComputerBuilder 
  42.  
  43. public override void CreateCompName() 
  44. ComputerInstance = new Computer(); 
  45. ComputerInstance.CompName = "IBM电脑"
  46.  
  47. public override void CreateCompMemory() 
  48. ComputerInstance.MemorySize = "2G"
  49.  
  50. public override void CreateCompDisk() 
  51. ComputerInstance.DiskSize = "1000G"

        四、指挥者角色

 
  1. //指挥者 
  2. class CreateDirector 
  3. /// <summary> 
  4. /// 调用建造者抽象方法以生产产品 
  5. /// </summary> 
  6. /// <param name="compBuilder"></param> 
  7. public void CreateComputer(ComputerBuilder compBuilder) 
  8. compBuilder.CreateCompName(); 
  9. compBuilder.CreateCompMemory(); 
  10. compBuilder.CreateCompDisk(); 

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



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826743

相关文章
|
3月前
|
设计模式 Java 机器人
Java设计模式-建造者模式
建造者(Builder)模式指将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。它是把对象的构建和表述分离。
40 0
Java设计模式-建造者模式
|
3月前
|
设计模式
设计模式 | 建造者模式
设计模式 | 建造者模式
36 0
|
3月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——04建造者模式
Golang设计模式——04建造者模式
23 0
|
3月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
39 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
3月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
30 1
|
5天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
12 1
|
7天前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
1月前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式
|
1月前
|
设计模式 算法 程序员
【设计模式】建造者模式
【设计模式】建造者模式