商业鬼才教你 工厂方法 && 抽象工厂 模式

举报
看,未来 发表于 2020/12/30 00:27:26 2020/12/30
【摘要】 故事线 广军把奶茶店开起来之后,接下来便是要购置机器和材料了。 对于饮料机,摆在他眼前的有两个选择,其一是“水龙头式饮料机”,长这样: 另一种是“冲泡式”奶茶机,是这种: 他想了想,选了第二种。 他说:第一种机器,如果要再上新品,只能再加个桶,麻烦,这机器还不知道能不能再加桶,而奶茶机就比较友好了,要泡什么奶茶,只要把材料配一下,搅拌一下,加热/冷藏 一...

在这里插入图片描述

故事线

广军把奶茶店开起来之后,接下来便是要购置机器和材料了。

对于饮料机,摆在他眼前的有两个选择,其一是“水龙头式饮料机”,长这样:
在这里插入图片描述

另一种是“冲泡式”奶茶机,是这种:
在这里插入图片描述

他想了想,选了第二种。
他说:第一种机器,如果要再上新品,只能再加个桶,麻烦,这机器还不知道能不能再加桶,而奶茶机就比较友好了,要泡什么奶茶,只要把材料配一下,搅拌一下,加热/冷藏 一下,就可以拿去卖了,想出什么新品就出什么新品。

到这里就完了吗?不不不,我们的广军可不是个傻子,仅仅卖奶茶,可不能满足他,他决定再购置一台汉堡机,一台香肠机、一手奶茶,一手汉堡加香肠,汉堡吃的口渴了再点杯奶茶,奶茶单喝没意思,顺手点个汉堡,汉堡吃不太饱再来几条香肠。

在这里插入图片描述
在这里插入图片描述

这时候,他又发现,这些机器如果零散摆放,当客流量大的时候要跑动跑西累成狗,那怎么可以?绝对不允许,于是他又买了个工作台。

在这里插入图片描述

简直是商业鬼才!!

工厂方法模式

这个故事的前半部分,就是工厂方法模式的一个实现场景。

什么是工厂方法模式呢?
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
如果广军他买了前面那个可乐机,那么这个饮料单就被限制死了,不灵活。但是他买了第二种奶茶机,那么他只要把材料倒进机器中,其他交给机器。如果要出什么新品,那就换一些原料罢了。

我们来看一张 工厂方法模式的类图:
在这里插入图片描述

代码实现

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

抽象工厂模式

什么是抽象工厂模式,它的定义也是很抽象的了:为创建一组相关或互相依赖的对象提供一个接口,而且无需指定它们的具体类。

喏,通用类图:
在这里插入图片描述

话不多说,太抽象了,还是看我们故事中的图吧(工作台 == 抽象机器):

在这里插入图片描述

可以考虑对抽象类使用模板,来看看代码实现:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

还行吧。

创作不易,顺手收藏好习惯,划着划着,就找不到了。

在这里插入图片描述

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/108595990

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。