一. 概述

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. helm部署Filebeat + ELK

    helm部署Filebeat + ELK 系统架构图: 1) 多个Filebeat在各个Node进行日志采集,然后上传至Logstash 2) 多个Logstash节点并行(负载均衡,不作为集群),对 ...

  2. Spring MVC-从零开始-分拆applicationContext. xrnl

    1.目录结构 2.web.xml配置 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app ...

  3. Hadoop点滴-初识MapReduce(2)

    术语: job(作业):客户端需要执行的一个工作单元,包括输入数据.MP程序.配置信息 Hadoop将job分成若干task(任务)来执行,其中包括两类任务:map任务.reduce任务.这些任务在集 ...

  4. SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍

    登录总结 前面基本介绍了security的常规用法,同时介绍了JWT和它的一个简单实现,基本上开发中遇到的登录问题都能解决了,即使在分布式开发,或者微服务开发中实现登录也基本没有问题了.securit ...

  5. 你竟然不装油猴插件-Chrome神器TamperMonkey

    油猴插件是一款可以在chrome浏览器中使用油猴脚本的插件.理解为脚本运行的平台 脚本 是一段代码,安装之后,有些脚本能为网站添加新的功能,有些能使网站的界面更加易用,有些则能隐藏网站上烦人的部分内容 ...

  6. python pytesseracct WinError2

    接上一个3步图像识别,本来已经在两台电脑同样的操作3步都可以识别出验证码,但是今天在新电脑同样的步骤却出现了winerror2,泪崩. 一样的配方,不一样的结果. 后来发现是调用不到tesseract ...

  7. export import 的用法和注意之处

       1.整体引入: 会将若干export导出的内容组合成一个对象返回: import *as  api from  utils.https; api为自定义名称,可直接指定此文件中的某个方法,uti ...

  8. K8s 从懵圈到熟练 – 镜像拉取这件小事

    作者 | 声东 阿里云售后技术专家 导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松 ...

  9. shell命令大全笔记

    ## -print 将匹配的文件输出到标准输出## -exec 将匹配的文件执行该参数所给出的shell命令## -ok 将匹配的文件执行该参数所给出的shell命令,每次执行命令有提示 #----- ...

  10. Redis对象——字符串

    文章导航-readme 前言     上一篇文章Redis之对象篇--Redis对象系统简介简单介绍了Redis的对象系统.Redis使用对象来表示数据库中的键和值每个对象都由一个redisObjec ...