zoukankan      html  css  js  c++  java
  • 设计模式C++描述----07.建造者(Builder)模式

    一. 概述

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

    三. 说明

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

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

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

  • 相关阅读:
    Java--8--新特性--Lambda
    java--Annotation实现
    原生Ajax代码实现
    java--动态代理设计模式,CGLIB实现的动态代理设计模式
    java--分析简单java类与反射的联系
    java--反射的基本概念
    Oracle-4
    初始化springbean
    spring初始化bean对象的三种方式:init-method,afterPropertiesSet和BeanPostProcessor
    在注释中查看其它的类的方式
  • 原文地址:https://www.cnblogs.com/any91/p/3247987.html
Copyright © 2011-2022 走看看