简单工厂模式
借用别人博客中的一段话:针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。为啥呢?如果代码是针对接口编程,那么通过多态可以与任何新类实现该接口。但是,当代码使用大量的具体类时,这就很麻烦了,就必须对代码进行改变。也就是说,你的代码并非“对修改关闭”。想用新的具体类型来扩展代码,就必须重新 打开它。
那么该怎么办呢?简单工厂模式帮我们解决了这一问题,工厂(factory)处理创建对象的细节,工厂的作用非常简单:
- 接收信息
- 根据接收的信息生产产品(返回需要的对象)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zyb6japJ-1583335240246)(image-20200304230102421.png)]
以上图中计算器的程序为例,我们要达到输入两个数字以及中间的运算符,输出相应的运算结果的目的,就像每个人都做过的a+b problem一样。
在开始前,我们已经写好了基类——运算类:
class Operation {
public:
double numberA;
double numberB;
// 用于得到A参数
void setNumberA(const double &numA){
numberA = numA;
}
// 用于得到B参数
void setNumberB(const double & numB){
numberB = numB;
}
// 定义虚类,用于 不同运算符下的计算
virtual double getResult(){
double res = 0;
return res;
}
};
并已经完成了加减法、乘除法类中对于基类的重写(override)。
为了达到让I/O模块和运算模块分离的目的,我们声明了工厂类:
class OperationFactory{
public:
Operation* createOperate(string operate){
Operation* oper = nullptr;
if(operate == "+")
oper = new AddOperation();
else if(operate == "-")
oper = new SubOperation();
else if(operate == "/")
oper = new DivOperation();
else if(operate == "*")
oper = new MulOperation();
return oper;
}
};
可以看到,工厂类的功能非常简单即:
- 接收表示运算符的字符串
- 根据接收的字符串返回相应的运算类
后记:我写完这些之后听说,简单工厂类不是设计模式,心态崩了😂,简单工厂模式经常被使用,但是需要说明的是:简单工厂不是一个设计模式,同时简单工厂模式并非工厂模式(Factory Pattern),他们之间是不能画上等号的。
再提醒一次,在设计模式中,所谓的“实现一个接口”并“不一定”表示“写一个类。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。