飞道的博客

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

360人阅读  评论(0)

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

老板来杯奶茶加汉堡

我那朋友也是争气,两周不见,人家从一个奶茶店的小老板,把隔壁汉堡店给吞并了。这不,现在去他家,都可以点汉堡了。
于是,我就招呼他一声:老板,一杯瑞纳冰,一个牛肉堡。老规矩,不用找了。

于是,他就开始了紧张的工作。
这次和上次有什么不同呢?对,职能多了,多了一个汉堡。那就多了一个做汉堡的机器,那可如何是好?

别急,让我们先把类图画出来:

还记得上一篇我说:可以考虑对抽象类使用模板吗?

于是我就尝试用模板抽象函数去实现了一下。

#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; }
};


//汉堡主类
class humberger {
public:
	virtual void add_burdening() = 0;//加料
};

//牛肉堡
class beef :public humberger {
public:
	void add_burdening() { cout << "不加辣" << endl; }
};

//鸡腿堡
class chicken :public humberger {
public:
	void add_burdening() { cout << "微辣" << endl; }
};

//香辣堡
class piquancy :public humberger {
public:
	void add_burdening() { cout << "巨辣" << endl; }
};

//接下来定义一台机器
template<class T1, class T2>
class abstractMachin {
public:
	virtual void createMilk(T1* c) = 0;
	virtual void createHumb(T2* c) = 0;
};

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


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

	//再来个牛肉堡
	abstractMachin<Milk,humberger>* bm = new Machin<Milk,humberger>();
	beef* bf = new beef();
	bm->createHumb(bf);

	return 0;
}

遇到问题

我发现一个问题,就是如果要拓展一个业务,就得去添置新机器,好像也很合理啊,但是会影响到每一个机器,因为模板。
网上其他代码,不是用模板的,也逃不过这一劫,这就有点难受了。

抽象工厂模式

为创建一组相关或互相依赖的对象提供一个接口,而且无需指定它们的具体类。

喏,通用类图:

用武之地

优点

封装性。
产品族内为非公开状态。

缺点

难以拓展。

应用场景

非常简单:一个对象族,都有相同的约束,就可以用这个模式。什么意思呢?比方说汉堡和奶茶,都是用来吃的,但是具体实现过程不一样,那就可以,只要有可比性(都可以吃)就够。
当然,你要做好不打算拓展的心理准备。

要注意,都说它拓展困难,是对象族拓展困难,但是对象等级的拓展还是很简单的。


今天先到这儿啦,请期待明天的:模板方法模式


转载:https://blog.csdn.net/qq_43762191/article/details/106482517
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场