工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是
简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
下面的代码是在前面简单工厂模式上修改的,可以参考一下区别,代码里面有注释。
//
// main.cpp
// Factory
//
// Created by Ben_22 on 14-5-28.
// Copyright (c) 2014年 Ben_22. All rights reserved.
//
#include <iostream>
#include "string"
using namespace::std;
class Operation{
public:
double _numberA = 0;
double _numberB = 0;
public:
virtual double getResult()=0;
};
class OperationAdd : public Operation{
public:
double getResult() override{
return _numberA+_numberB;
}
};
class OperationSub : public Operation{
public:
double getResult() override{
return _numberA-_numberB;
}
};
class OperationMul : public Operation{
public:
double getResult() override{
return _numberA*_numberB;
}
};
class OperationDiv : public Operation{
public:
double getResult() override{
if (_numberB==0) {
printf("异常\n");
return 0;
}
return _numberA/_numberB;
}
};
/*下面为简单工厂模式*/
/*违背了开闭原则
*每次新加运算都要在OperationFactory类添加case修改类。
*/
class OperationFactory{
public:
static Operation* createOpr(char operate){
Operation *oper = nullptr;
switch (operate) {
case '+':
oper = new OperationAdd;
break;
case '-':
oper = new OperationSub;
break;
case '*':
oper = new OperationMul;
break;
case '\\':
oper = new OperationDiv;
break;
default:
break;
}
return oper;
};
};
/*下面为工厂方法模式*/
/*工厂方法对简单工厂做了进一步抽象, 多了一个Factory类,这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
*/
class Factory{
public :
Operation createOpr();
};
class FactoryAdd : public Factory{
public:
Operation *createOpr(){
return new OperationAdd();
}
};
class FactorySub : public Factory{
public:
Operation *createOpr(){
return new OperationSub();
}
};
class FactoryMul : public Factory{
public:
Operation *createOpr(){
return new OperationMul();
}
};
class FactoryDiv : public Factory{
public:
Operation *createOpr(){
return new OperationDiv();
}
};
int main(int argc, const char * argv[])
{
int num1 = 5, num2 = 9;
//简单工厂模式
Operation *temp1 = OperationFactory::createOpr('+');
temp1->_numberA = num1;
temp1->_numberB = num2;
cout<<"和"<<temp1->getResult()<<endl;
//工厂方法模式
Operation *tempA = (new FactoryAdd())->createOpr();
tempA->_numberA = num1;
tempA->_numberB = num2;
cout<<"和"<<tempA->getResult()<<endl;
return 0;
}