关于建造者模式(C++实现)——怎么做一个全家桶

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

谈谈个人体会

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值