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

2020-08-26 11:17:23 浏览数 (1)

老板来杯奶茶

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

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

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

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

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

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

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

小故事代码实现

代码语言:javascript复制
#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、升级为多个工厂,比方说老板现在不仅卖奶茶,他还要卖香肠、卖果汁、卖汉堡。那他就需要烤汉堡机,烤香肠机、榨汁机、奶茶机,所以我说抽象机器类要用模板。如果觉得前面太简单,可以做一下这个。

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

0 人点赞