一. 概述

Builder
模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开
来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。

二. 举例

KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设分为4个步骤;

但是 KFC 与 Mcdonalds 的汉堡味道有所差别,主要是在每一步的细节上有所不同。

顾客要吃汉堡并不关心具体的生产步骤,其实汉堡店也不关心,因为数百年来,这些步骤者是相同的,差别只在细节上。比如盐放多少,辣椒放多少等等。

结构如下:

Builder:为最基本的生产步骤

KFCBuilder:为KFC的具体生产步骤

MCDBuilder:为Mcdonalds的具体生产步骤

Director:为指挥者,用它来控件建造过程

  1. //////////////////////////////////////////////////////////////////////////
  2. //建造者
  3. class Builder
  4. {
  5. public:
  6. virtual ~Builder()
  7. {
  8. }
  9. virtual void BuildSetp1() = 0;
  10. virtual void BuildSetp2() = 0;
  11. virtual void BuildSetp3() = 0;
  12. virtual void BuildSetp4() = 0;
  13. };
  14. //KFC 具体建造者
  15. class KFCBuilder:public Builder
  16. {
  17. public:
  18. void BuildSetp1()
  19. {
  20. cout<<"KFC Step1:"<<endl;
  21. }
  22. void BuildSetp2()
  23. {
  24. cout<<"KFC Step2:"<<endl;
  25. }
  26. void BuildSetp3()
  27. {
  28. cout<<"KFC Step3:"<<endl;
  29. }
  30. void BuildSetp4()
  31. {
  32. cout<<"KFC Step4:"<<endl;
  33. }
  34. };
  35. //Mcdonalds 具体建造者
  36. class MCDBuilder:public Builder
  37. {
  38. public:
  39. void BuildSetp1()
  40. {
  41. cout<<"Mcdonalds Step1:"<<endl;
  42. }
  43. void BuildSetp2()
  44. {
  45. cout<<"Mcdonalds Step2:"<<endl;
  46. }
  47. void BuildSetp3()
  48. {
  49. cout<<"Mcdonalds Step3:"<<endl;
  50. }
  51. void BuildSetp4()
  52. {
  53. cout<<"Mcdonalds Step4:"<<endl;
  54. }
  55. };
  56. //////////////////////////////////////////////////////////////////////////
  57. //指挥者
  58. class Director
  59. {
  60. private:
  61. Builder *m_pBuilder;
  62. public:
  63. Director(Builder *builder)
  64. {
  65. m_pBuilder = builder;
  66. }
  67. void Create()
  68. {
  69. m_pBuilder->BuildSetp1();
  70. m_pBuilder->BuildSetp2();
  71. m_pBuilder->BuildSetp3();
  72. m_pBuilder->BuildSetp4();
  73. }
  74. };
  75. //////////////////////////////////////////////////////////////////////////
  76. //测试代码
  77. int main(int argc,char* argv[])
  78. {
  79. KFCBuilder kfc; //想吃KFC
  80. Director director(&kfc);
  81. director.Create();
  82. return 0;
  83. }

三. 说明

1. 建造者模式,在建造顺序上通常是稳定的。

2. 指挥者(Director),来隔离用户与具体建造过程的关联。

3. 它的好处是,客户端不需要知道具体的建造者方法,也不用但心忘记某一步骤没写,这些步骤统一由Director来调用。

设计模式C++描述----07.建造者(Builder)模式的更多相关文章

  1. Java设计模式-建造者(Builder)模式

    目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...

  2. Android设计模式源码解析之Builder模式

    https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...

  3. 建造者(Builder)模式

    建造者模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的 ...

  4. 《图解设计模式》读书笔记3-3 Builder模式

    目录 示例程序 类图 代码 角色 思路拓展 谁知道什么 构造和实现分离 和Template Method模式的区别和联系? Builder模式即建造者模式,利用这个模式可以组装具有复杂结构的实例. 示 ...

  5. Android 建造者(Builder)模式

    关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Bui ...

  6. 设计模式--建造者(Builder)模式

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模 ...

  7. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  8. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  9. 设计模式C++描述----21.解释器(Iterpreter)模式

    一. 解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子. 结构如下: 代码如下: //包含解释器之外的一些全局信息 class Conte ...

随机推荐

  1. Airflow自定义插件, 使用datax抽数

    Airflow之所以受欢迎的一个重要因素就是它的插件机制.Python成熟类库可以很方便的引入各种插件.在我们实际工作中,必然会遇到官方的一些插件不足够满足需求的时候.这时候,我们可以编写自己的插件. ...

  2. There is a cycle in the hierarchy解决

    前言: 在一次项目中,分页查询公告列表信息后,在遍历查询到的公告列表时出现了死循环“There is a cycle in the hierarchy”错误,分析原因是因为在公告实体类中包含了商铺对象 ...

  3. docker 运行容器时指定--sysctl参数来设置系统参数

    指定--sysctl参数来设置系统参数,通过这些参数来调整系统性能,Docker通过一个 ValidateSysctl函数来限制 sysctl参数可以传入的项,源码如下: // docker/opts ...

  4. MVC4 Jqgrid设计与实现

    项目本来使用的是webgrid.后台弃用改成Jqgrid插件. 首先介绍一下webgrid的用法:webgrid是mvc中HtmlHelper自带的.首先创建viewmodel用于数据的绑定,然后在页 ...

  5. SpringBoot注入Mapper失败

    SpringBoot注入Mapper失败,可能是因为没有加扫描Mapper层的注解 方式一:在所有mapper接口使用@Mapper注解 @Mapper public interface UserMa ...

  6. spring boot项目下application.properties中使用logging.path和logging.file时的细节

    logging.path仅仅用于指定日志输出的目录,且不能指定输出的文件名,且默认名为spring.log  若指定的是相对目录,则会生成在当前总项目的目录下 idea中新建sprnig boot项目 ...

  7. B-概率论-熵和信息增益

    目录 熵和信息增益 一.熵(Entropy) 二.条件熵(Conditional Entropy) 三.联合熵(Joint Entropy) 四.相对熵(Relative Entropy) 4.1 相 ...

  8. Linux内存描述之高端内存–Linux内存管理(五)

    服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...

  9. .NET Core 读取配置文件方式总结

    基于.NET Core的跨平台开发,配置文件与之前.NET Framework采用xml的config文件不同,目前主要是采用json文件键值对配置方式读取. 参考网上相关资料总结如下: 一.引入扩展 ...

  10. [ZJOI2006]物流运输trans

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...