关于建造者模式——怎么做一个全家桶

关于建造者模式,专业的术语介绍可以直接戳到菜鸟教程去学习——菜鸟教程~建造者模式

谈谈个人体会

建造者模式简直就是为全家桶系列而生的,它使用一个个简单的对象进而构成复杂的对象,就像肯德基使用简单的薯条、鸡腿、鸡翅、可乐等单一的食物推出了全家桶套餐。后序又将各种单一的产品进行组合他,不断推出全新的套餐,拉动消费。
屁话不多说了,下面介绍下我学习建造者模式后,用C++描述的一个简单demo。

UML图

这里写图片描述
强推一波staruml,这软件确实有丶东西,除了根据代码反向生成UML图不够精准(当然也可以说是我写的狗屁东西不符合人家的标准,狗头.jpg),但是它对于一个对象的各种描述真的是相当到位了,对于上手UML图绝对是利器。
饮料和汉堡是抽象类,各自派生出自己的产品,而它们和建造者又是聚合关系。离开了建造者它们也可以生活得很好。

代码

builder_mode.h

#pragma once

#include <string>
using namespace std;

class hamburger
{
protected:
    int m_price;
public:
    virtual int show_price() = 0;
};

class chicken_hamburger:public hamburger
{
public:
    //不能使用列表形式初始化从基类继承的成员变量
    chicken_hamburger(int price = 10)
    {
        m_price = price;
    }
    int show_price()
    {
        return m_price;
    }
};

class beef_hamburger:public hamburger
{
public:
    beef_hamburger(int price = 12)
    {
        m_price = price;
    }
    int show_price()
    {
        return m_price;
    }
};

class drink
{
protected:
    int m_price;
public:
    virtual int show_price() = 0;
};

class cola:public drink
{
public:
    cola(int price = 5)
    {
        m_price = price;
    }
    int show_price()
    {
        return m_price;
    }
};

class juice:public drink
{
public:
    juice(int price = 8)
    {
        m_price = price;
    }
    int show_price()
    {
        return m_price;
    }
};

class builder
{
private:
    hamburger *m_hamburger;
    drink *m_drink;
    int m_price;
    string m_name;
public:
    builder()
    {
        m_hamburger = NULL;
        m_drink = NULL;
        m_price = 0;
    }
    ~builder()
    {
        if (m_hamburger != NULL)
        {
            delete m_hamburger;
            m_hamburger = NULL;
        }
        if (m_drink != NULL)
        {
            delete m_drink;
            m_drink = NULL;
        }
    }
    void prepare_cola()
    {
        if (m_hamburger != NULL)
        {
            delete m_hamburger;
            m_hamburger = NULL;
        }
        if (m_drink != NULL)
        {
            delete m_drink;
            m_drink = NULL;
        }
        m_price = 0;
        m_drink = new cola;
        m_name = "cola";
    }
    void prepare_beef_hamburger()
    {
        if (m_hamburger != NULL)
        {
            delete m_hamburger;
            m_hamburger = NULL;
        }
        if (m_drink != NULL)
        {
            delete m_drink;
            m_drink = NULL;
        }
        m_price = 0;
        m_hamburger = new beef_hamburger;
        m_name = "beef_hamburger";
    }
    void prepare_beef_hamburger_with_cola()
    {
        if (m_hamburger != NULL)
        {
            delete m_hamburger;
            m_hamburger = NULL;
        }
        if (m_drink != NULL)
        {
            delete m_drink;
            m_drink = NULL;
        }
        m_price = 0;
        m_hamburger = new beef_hamburger(10);
        m_drink = new cola(3);
        m_name = "beef_hamburger_with_cola";
    }
    void prepare_chicken_hamburger_with_juice()
    {
        if (m_hamburger != NULL)
        {
            delete m_hamburger;
            m_hamburger = NULL;
        }
        if (m_drink != NULL)
        {
            delete m_drink;
            m_drink = NULL;
        }
        m_price = 0;
        m_hamburger = new chicken_hamburger(8);
        m_drink = new juice(6);
        m_name = "chicken_hamburger_with_juice";
    }
    int show_price()
    {
        if (m_drink != NULL)
            m_price += m_drink->show_price();
        if (m_hamburger != NULL)
            m_price += m_hamburger->show_price();
        return m_price;
    }
    string show_name()
    {
        return m_name;
    }
};
builder_mode.cpp

#include <iostream>
#include "builder_mode.h"
using namespace std;

int main(int argc, char const *argv[])
{
    builder buil;
    buil.prepare_chicken_hamburger_with_juice();
    cout << "name: " << buil.show_name() << endl;
    cout << "price: " << buil.show_price() << "RMB" <<endl;
    buil.prepare_cola();
    cout << "name: " << buil.show_name() << endl;
    cout << "price: " << buil.show_price() << "RMB" << endl;
    return 0;
}

恭喜自己,写demo的时候又踩坑了,真的是一踩一个准,一踩一个爽鸭!
切记,派生类不能使用列表形式初始化从基类继承过来的成员变量
这是为什么呢?

结果

这里写图片描述
什么时候我也可以拥有一个全家桶,里面啥都有……………..
醒醒,明天该上班写bug了

猜你喜欢

转载自blog.csdn.net/LonelyGambler/article/details/82315839