简单工厂模式
来源:互联网 发布:数据的真实性 编辑:程序博客网 时间: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。
- 工厂模式-简单工厂
- 工厂模式-简单工厂
- 工厂模式-简单工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 简单工厂和工厂模式
- 简单工厂和工厂模式
- 1,工厂模式--简单工厂
- 简单工厂和工厂模式
- 简单工厂,工厂模式,抽象工厂
- 简单工厂,工厂模式,抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂模式和抽象工厂
- Java开发OpenStack相关应用
- Pein线段树总结(陆续更新ing)
- DB2数据库的隔离级解读与试验
- malloc函数
- Android 输入法键盘遮挡控件问题的解决办法
- 简单工厂模式
- Python基础教程学习(四)类的创建与继承
- 闪亮登场:开发者制作图形图表所需的11款JS工具包
- 什么是REST?
- hdu 1242 Rescue 优先队列
- 标准C++中的 string 类总结
- VC++6.0实现JNI的最简单的例子
- c++字符串详解
- Topic Model的分类和设计原则