极速理解设计模式系列: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月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
1月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
59 0
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。