一. 概述

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. for for in 给已有的li绑定click事件生成新的li也有click事件

    想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...

  2. Java8新特性——lambda函数式编程

    一.遍历循环 /** * @author jiaqing.xu@hand-china.com * @version 1.0 * @name * @description 循环遍历 * @date 20 ...

  3. Terminal MultipleXer---终端复用器tmux基本使用

    Terminal MultipleXer---终端复用器tmux 使用场景:1.scp大文件 2:编译大文件 3:多窗口对比文件 1.安装tmux [root@localhost ~]# yum in ...

  4. uC/OS-III 软件定时器(三)

    软件定时器是uC/OS 操作系统的一个内核对象,软件定时器是基于时钟节拍和系统管理创建的软件性定时器,理论上可以创建无限多个,操作简单,但精准度肯定比硬件定时稍逊一筹. 原理和实现过程 要用到的函数: ...

  5. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...

  6. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  7. 面试题解析|ACL权限控制机制

    ACL(Access Control List)访问控制列表 包括三个方面: 一.权限模式(Scheme) 1.IP:从 IP 地址粒度进行权限控制 2.Digest:最常用,用类似于 usernam ...

  8. [LeetCode] 1108. Defanging an IP Address

    Description Given a valid (IPv4) IP address, return a defanged version of that IP address. A defange ...

  9. 分布式系统的延时和故障容错之Spring Cloud Hystrix

    本示例主要介绍 Spring Cloud 系列中的 Eureka,如何使用Hystrix熔断器容错保护我们的应用程序. 在微服务架构中,系统被拆分成很多个服务单元,各个服务单元的应用通过 HTTP 相 ...

  10. 04、JDBC范例

    范例:JDBC查询 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...