关于建造者模式,专业的术语介绍可以直接戳到菜鸟教程去学习——菜鸟教程~建造者模式
谈谈个人体会
建造者模式简直就是为全家桶系列而生的,它使用一个个简单的对象进而构成复杂的对象,就像肯德基使用简单的薯条、鸡腿、鸡翅、可乐等单一的食物推出了全家桶套餐。后序又将各种单一的产品进行组合他,不断推出全新的套餐,拉动消费。
屁话不多说了,下面介绍下我学习建造者模式后,用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了