一. 概述

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. centos7 远程连接其他服务器mysql

    在本地远程连接 在终端输入: mysql -h 服务器ip地址 -P 端口 -u 用户名 -p 然后输入密码即可.

  2. flexible.js分析--JavaScript

    //立即执行函数 (function flexible(window, document) { // 获取的html 的根元素 var docEl = document.documentElement ...

  3. Logrotate配置

    目录 Logrotate配置 参考 Logrotate Description Logrotate Configuration Logrotate配置

  4. 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法

      很多新手在购买的虚拟主机后就开始尝试安装,却发现连接数据库老是出错,不知道什么问题,反复检查了自己填写的数据库连接信息发现也没有问题,这个时候我们似乎就没法了. 但这个其实是后台空间的设置问题,你 ...

  5. Zookeeper工作过程详解

    一.Zookeeper工作机制 分布式和集中式系统相比,有很多优势,比如更强的计算能力,存储能力,避免单点故障等问题.但是由于在分布式部署的方式遇到网络故障等问题的时候怎么保证各个节点数据的一致性和可 ...

  6. FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据

    一.播放视频说明 1.两种方式播放视频 ①shader播放YUV,后面再介绍. ②RGB直接显示数据,简单.性能差,用到FFmpeg的格式转换,没有shader效率高.本文介绍这个方式. 2.GLSu ...

  7. Spring Boot 2.X(一):入门篇

    什么是 Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架遵循"约定优于配置& ...

  8. LitePal的存储操作

    传统的存储数据方式   其实最传统的存储数据方式肯定是通过SQL语句拼接字符串来进行存储的,不过这种方式有点过于“传统”了,今天我们在这里就不讨论这种情况.实际上,Android专门提供了一种用于存储 ...

  9. python urllib2实现http GET PUT DELETE POST的方法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/11 下午8:33 # @Author : liubing # @File ...

  10. Django高级实战 开发企业级问答网站 ✌✌

    Django高级实战 开发企业级问答网站 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问 ...