简单工厂模式

来源:互联网 发布:数据的真实性 编辑:程序博客网 时间:2024/06/08 14:42

简单工厂模式,听这个名字,就知道它的原理并不复杂,在未接触这个模式之前,估计我们很多开发人员已经用到了这个模式,只是不知道叫“简单工厂模式”而已,说到这里,不得不说设计模式的妙处,它提供了一套通用的专用术语,供我们交流,简化了我们的交流成本。

这里先列举一个具体我们需要实现的需求,我们有一个Pizza店,它能满足用户订购Pizza等等其他功能。当然,你可以订购各种各样的Pizza。我们先来看一段有缺陷的代码。

#include <iostream>#include <string>using namespace std;class Pizza{public:string name;Pizza(): name("Pizza"){}void prepare(){cout << "准备Pizza" << endl;}void bake(){cout << "烘烤Pizza" << endl;}void cut(){cout << "切Pizza" << endl;}void box(){cout << "装Pizza" << endl;}};class CheesePizza : public Pizza{public:CheesePizza(){name = "CheesePizza";}};class GreekPizza : public Pizza{public:GreekPizza(){name = "GreekPizza";}};class PizzaStore{public://订购一个PizzaPizza* orderPizza(string pizzaType){Pizza *pizza = NULL;if (0 == pizzaType.compare("CheesePizza")){pizza = new CheesePizza;}else if (0 == pizzaType.compare("GreekPizza")){pizza = new GreekPizza;}pizza->prepare();pizza->bake();pizza->cut();pizza->box();cout << "订购的Pizza:" << pizza->name << endl;return pizza;}};void main(){int i = 0;PizzaStore *pizzaStore = new PizzaStore;Pizza *pizza = pizzaStore->orderPizza("CheesePizza");delete pizzaStore;delete pizza;cin >> i;}
这样的设计,在产生Pizza实例时,我们是面向实现编程,而不是面向接口编程。其实直接看这段代码,也没有什么大问题,主要是这仅仅是一个简单的例子而已,假如我们接着完善这个PizzaStore类,里面增加更多的Pizza操作函数,而这些函数中也需要获取Pizza实例,那构造Pizza实例的那部分代码:

Pizza *pizza = NULL;if (0 == pizzaType.compare("CheesePizza")){pizza = new CheesePizza;}else if (0 == pizzaType.compare("GreekPizza")){pizza = new GreekPizza;}
就要拷贝很多份了,问题出现了吧,这种情况,对于没有接触设计模式的人都会想到一种方法来解决,就是封装一个函数接口,专门用于Pizza的创建,其实这就是简单工厂模式了。当我们给别人解释我们的设计方案时,可能会说:“我将创建Pizza对象的代码封装了起来,并提供一个函数接口用于获取不同的Pizza”。当时我们都知道设计模式时,我们就可以直接告诉对方,我采用了简单工厂模式获取Pizza实例。爽吧!

下面来完成我们的简单工厂模式,改造一下代码:

class PizzaFactory{public://这里也可以使用静态函数,如果使用静态函数,那么我们创建的是静态工厂//优点:不需要创建工厂实例//缺点:无法通过继承覆盖创建的方法Pizza* createPizza(string pizzaType){Pizza *pizza = NULL;if (0 == pizzaType.compare("CheesePizza")){pizza = new CheesePizza;}else if (0 == pizzaType.compare("GreekPizza")){pizza = new GreekPizza;}return pizza;}};class PizzaStore{public:PizzaStore(PizzaFactory *pizzaFactory){this->pizzaFactory = pizzaFactory;}//订购一个PizzaPizza* orderPizza(string pizzaType){Pizza *pizza = NULL;pizza = pizzaFactory->createPizza(pizzaType);//这里实现了对象创建和客户端的解耦pizza->prepare();pizza->bake();pizza->cut();pizza->box();cout << "订购的Pizza:" << pizza->name << endl;return pizza;}private:PizzaFactory *pizzaFactory;};void main(){int i = 0;PizzaFactory *pizzaFactory = new PizzaFactory;PizzaStore *pizzaStore = new PizzaStore(pizzaFactory);Pizza *pizza = pizzaStore->orderPizza("CheesePizza");delete pizzaStore;delete pizza;delete pizzaFactory;cin >> i;}


总结一下:

其实简单工厂模式,在一定意义上称不上一个设计模式,我们可以简单的把它看作一种设计习惯。简单工厂模式帮助我们实现了对象创建和客户端的解耦。同时让我们的创建代码得到了复用,避免了代码的Copy。

原创粉丝点击