学以致用C++设计模式 之 “工厂模式”

   日期:2020-06-03     浏览:141    评论:0    
核心提示:这是一段防爬虫文字,读者可跳过本文为CSDN作者“看,未来”原创,我的CSDN地址为 https://lion-wu.blog.csdn.net/本篇隶属于我的专栏 - 《设计模式 之 设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html作者版权,未经允许,禁止转载。老板来杯奶茶一个好朋友开了家奶茶店,生意很是红火。今天我带着几个朋友去给他捧场,到了店里,A说:老板,草莓味双皮奶加珍珠。B说:老板,香草味珍珠奶茶加椰..设计模式

这是一段防爬虫文字,读者可跳过
本文为CSDN作者“看,未来”原创,我的CSDN地址为 https://lion-wu.blog.csdn.net/
本篇隶属于我的专栏 - 《设计模式 之 设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html
作者版权,未经允许,禁止转载。

老板来杯奶茶

一个好朋友开了家奶茶店,生意很是红火。
今天我带着几个朋友去给他捧场,到了店里,老板给出了菜单:

香草味珍珠奶茶加椰果
草莓味双皮奶加珍珠
拿铁
巧克力瑞纳冰

A说:老板,草莓味双皮奶加珍珠。B说:老板,香草味珍珠奶茶加椰果。C说:拿铁一杯谢谢。我说:巧克力瑞纳冰,外加免费谢谢。

老板听得一脸黑线,但还是去了。我呢,看他那么赚钱,也想学两手,也就跟着去了。
只见老板把一众拆料摆在桌子上,一会儿加这个材料,一会儿加那个材料,然后放机器上加工一下,打包解决。

该过程涉及三个不同对象:老板、加工机器、不同种类的奶茶。

老板可以用场景类Client表示,加工机器类似于一个工厂,负责制作产品,不同种类的奶茶,它们都是同一个接口下的不同具体实现类,都是奶茶嘛,只是成分不同,口味不同而已。

分析完毕,那么我们就可以把类图画出来:

小故事代码实现

#include<iostream>

using namespace std;

//奶茶主类
class Milk {
public:
	virtual void set_taste() = 0;//设置口味
	virtual void add_burdening() = 0;//加料
};

//双皮奶
class custard :public Milk {
public:
	void set_taste() { cout << "草莓味双皮奶" << endl; }
	void add_burdening() { cout << "加珍珠" << endl; }
};

//珍珠奶茶
class pearl :public Milk {
public:
	void set_taste() { cout << "香草味珍珠奶茶" << endl; }
	void add_burdening() { cout << "加椰果" << endl; }
};

//拿铁
class coffee :public Milk {
public:
	void set_taste() { cout << "拿铁" << endl; }
	void add_burdening() { cout << "不加料" << endl; }
};

//巧克力瑞纳冰
class ruinaice :public Milk {
public:
	void set_taste() { cout << "巧克力瑞纳冰" << endl; }
	void add_burdening() { cout << "加奶油" << endl; }
};

//所有饮品定义完毕,接下来定义一台机器
//template<class T>
class abstractMachin {
public:
	virtual void createMilk(Milk *c) = 0;
};

//机器具体实现
//template<class T>
class Machin :public abstractMachin {
public:
	void createMilk(Milk *c) {
		c->set_taste();
		c->add_burdening();
	}
};

//现在材料有了,机器也有了,是时候做奶茶了
class Boss {
	 //老板就是那个main()
};

int main() {
	//初始化一个机器
	abstractMachin* am = new Machin();
	//先做瑞纳冰
	Milk* ruina = new ruinaice();
	am->createMilk(ruina);

	return 0;
}

感悟

写的时候,我也发现这种模式有点不太方便,可以发现上面类图有个纰漏,那个string的传参,我下意识的把这个模式和装饰者模式混一起去了。我觉得这个模式和“装饰者”、“建造者”模式有很多相同的地方,但是那两个模式明显要有优势,这个模式的优势就在于:它更简单。

上面那个抽象机器类其实应该用模板会比较通用,成为一个通用接口。

工厂方法的定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类(后面你会发现好多设计模式都能,应该是因为这个设计模式出来的早吧,后面的设计模式都参考了它的思想)。

工厂方法模式的应用

优势

1、良好的封装性
2、拓展性优秀
3、屏蔽产品类
4、典型的解耦框架,高层模块只需要知道产品的抽象类,具体实现和它们没关系。

使用场景

需要灵活的、可拓展的框架时。

学以致用

请自己实现一个“俄罗斯方块产生”功能,自己设计。

工厂方法模式拓展

1、缩小为简单工厂模式
2、升级为多个工厂,比方说老板现在不仅卖奶茶,他还要卖香肠、卖果汁、卖汉堡。那他就需要烤汉堡机,烤香肠机、榨汁机、奶茶机,所以我说抽象机器类要用模板。如果觉得前面太简单,可以做一下这个。

今天先到这里,明天见(抽象工厂模式)。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服