zoukankan      html  css  js  c++  java
  • 设计模式之建造者模式

    Builder-- 建造者模式:  将一个复杂对象的构建和表示分离, 使得同样的构建过程可以有不同的表示。  

    从定义可以看出, builder模式有两个重要的点,

    1. 构建与表示分离

    2. 同样的构建过程有不同的表示。

    这里可以看出,对于builder模式来说, 构建过程是相同的。而在构建过程中,根据不同的需求。构建出不同的对象。

    建造者模式属于对象创建型模式, 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,

    用户不需要知道内部的具体构建细节(即构建过程)

    builder模式的UML图:

    1. Director: 指挥者, 根据客户的提示, 决定构建使用哪种builder 构建产品

    2. Builder: 抽象构建类,定义了构建的过程。

    3. ConcreteBuilder: 实际的构建类,构建不同的产品

    4. product: 需要构建的产品, 具体的构建类,将在每一步的时候,对产品的部分进行构造,最后完成。

    builder模式的使用场景:

    当创建复杂对象时,对象内部的的建造顺序是稳定的,但是当对象的每一个部件,都有着不同的变化,可以使用builder 模式。

     举例:

    一家生意很好的饭店,最近遭到了竞争,他们观察对手,发现对手针对不同的人群推出了多种套餐,如套餐A: 绿豆面+红豆汤+萝卜丝  套餐B:凉皮+冰峰。 套餐C:鸡腿饭+可乐

    老板观察后,决定也推出相应的套餐。并使用建造者模式,提高套餐生成效率

    套餐= 主食+饮品+小吃

     1 class Waiter
     2 {
     3 private:
     4     BuildTaocan* _taocan;
     5 public:
     6     void setTaocan(BuildTaocan* tc)
     7     {
     8         this->_taocan = tc;
     9     }
    10 
    11     void Construct()
    12     {
    13         _taocan->addFood();
    14         _taocan->addDrink();
    15         _taocan->addsnacks();
    16     }
    17 
    18 };
    19 
    20 class BuildTaocan
    21 {
    22     virtual void addFood();
    23     virtual void addDrink();
    24     virtual void addsnacks();
    25     virtual void getTaocan();
    26 };
    27 
    28 class BuildTaocanA
    29 {
    30 private:
    31     TaoCan _tc;
    32 public:
    33     virtual    void getTaocan()
    34     {
    35         cout << "taocan a" << _tc.food() << _tc.Drink() << _tc.snacks() << endl;
    36     }
    37     virtual void addDrink()
    38     {
    39         tc.setDrink("hongdoutang");
    40     }
    41     virtual void addFood()
    42     {
    43         tc.setFood("lvdoumian");
    44     }
    45 };

    client:

    Waiter waiter();

    BuildTaoCanA cana;

    waiter.setTaocan(&cana);

    waiter.Construct();

    cana.getTaocan();

    ~~~~~
  • 相关阅读:
    推导式
    解构
    for 循环
    运算符
    while 循环
    流程控制语句
    索引和切片
    ASC转换BCD,ASC2BCD(转)
    CString和char互转,十六进制的BYTE转CString
    C++添加简单的日记记录
  • 原文地址:https://www.cnblogs.com/missmzt/p/5695761.html
Copyright © 2011-2022 走看看