简单工厂模式,简单的理解就是创建一个工厂,工厂里存放着各种各样的算法类。以计算器为例,我们创建的就是一个工厂类。工厂类的作用就是创建不同的对象,换句话说,就是将各种计算方法封装。
接下来,我们用简单工厂模式开始写一个计算器。
1、 创建方法
class method{
public:
int num_one;
int num_two;
method(){};
virtual int type() = 0;
~method(){};
};
这是一个总的方法,这里有一点需要注意的就是virtual int type() = 0;这是一个纯虚函数。一开始,我只将它定义为虚函数,编译就出现问题,改成纯虚函数之后编译就通过了。为什么呢?经过我的反复实践,原因是虚函数也是要进行定义实例化的,不能将它放在那儿不管。纯虚函数就可以。
写完总方法之后,就是将各种运算方法继承总方法就行了,如下:
class methodplus:public method{
int type(){
int plus = 0;
plus = num_one+num_two;
return plus;
}
};
class methodminus:public method{
int type(){
int minus = 0;
minus = num_one-num_two;
return minus;
}
};
这里为了体现工厂的作用,我特地定义了两个运算,当然有兴趣的同学再多加几种运算也可以,这就是工厂的强大之处。运算类的主要作用就是将virtual int type() = 0;实例化。
2、 创建工厂
class factory{
public:
method* MethPl;
method* createobject(const char *target);
factory(){};
~factory(){};
static factory& GetFactory();
};
工厂类里面比较重要的就是method* createobject(const char *target);和static factory& GetFactory();前者根据传进来的参数来确定应该创建哪一种运算,后者实现封装,提供接口的功能。
工厂创建对象的方法,如下:
method* factory::createobject(const char *target){
if(NULL==target){
return NULL;
}
if(0==strcmp("+",target)){
MethPl = new methodplus();
printf("create success\n");
return MethPl;
}
if(0==strcmp("-",target)){
…
这里的代码虽然不完整,但是足够说明工厂创建对象的方法了
3、 编写接口
将封装进行到底的结果就是只剩下一堆接口,下面我们将工厂创建对象等一系列操作进行封装,如下:
factory& factory::GetFactory(){
static factory dreamfactory;
return dreamfactory;
}
method* operation(const char *target){
return factory::GetFactory().createobject(target);
}
4、 主程序
菜鸟的思维就是总觉得不懂的知识非常的牛。刚开始,本菜鸟以为简单工厂模式相当的高明,于是,就忘了在主程序里面定义指向运算的指针,结果并没有预期的好。于是,本菜鸟就想了,虽然工厂很厉害,但要是没有指针指向那个对象,我又怎么能使用创建的对象呢?于是,就豁然开朗了,乖乖的在主程序里面定义了一个指针,结果显然——成功了,如下:
#include "factory.h"
#include <stdio.h>
int main()
{
int one = 0,two = 0,num = 0;
char type[2] = {};
printf("input two numbers:\n");
scanf("%d%d",&one,&two);
printf("input the type:\n");
scanf("%s",&type);
method *test = NULL;
test = operation(type);
test->num_one = one;
test->num_two = two;
num = test->type();
printf("num = %d\n",num);
return 0;
}
细心的鸟儿就会批评本菜鸟了:没有对参数做错误检查!代码难看!!命名不地道!!!没有做异常处理!!!!咆哮体直接打击到了本菜鸟的自信心。
5、 总结:
从以上4步骤,我们实现了简单工厂模式的设计思想。工厂的作用就在于,你需要什么样的产品(运算方式),我就给你创建什么样的产品,不痛不痒(无需修改以前的代码,只需要在头文件添加相应的继承类)。这个也体现了C++的封装思想。使用时,只要调用接口就可以了。