工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
下面还是举例怎样设计一个计算器。
结构图如下:
请自觉的比较 简单工厂模式和工厂方法模式的异同。
直接上代码:
#include<iostream>
#include<string>
using namespace std;
//抽象运算类
class Operation
{
private:
double numberA = 0;
double numberB = 0;
public:
double getNumberA()
{
return numberA;
}
void setNumberA(double _numberA)
{
numberA = _numberA;
}
double getNumberB()
{
return numberB;
}
void setNumberB(double _numberB)
{
numberB = _numberB;
}
virtual double getResult() = 0
{
double result = 0;
return result;
}
};
//加法类
class OperationAdd :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
};
//减法类
class OperationSub :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
};
//乘法类
class OperationMul :public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
};
//除法类
class OperationDiv :public Operation
{
public:
double getResult()
{
double result = 0;
if (this->getNumberB() == 0)
{
cout << "除数不能为0" << endl;
return 0;
}
result = getNumberA() / getNumberB();
return result;
}
};
//工厂接口类
class IFactory
{
public:
virtual Operation* createOperation()=0;
};
//加法工厂类
class AddFactory : public IFactory
{
public:
Operation* createOperation()
{
return new OperationAdd();
}
};
//减法工厂类
class SubFactory : public IFactory
{
public:
Operation* createOperation()
{
return new OperationSub();
}
};
//乘法工厂类
class MulFactory : public IFactory
{
public:
Operation* createOperation()
{
return new OperationMul();
}
};
//除法工厂类
class DivFactory : public IFactory
{
public:
Operation* createOperation()
{
return new OperationDiv();
}
};
//客户端代码
int main()
{
IFactory* operFactory = new DivFactory();
Operation * oper = operFactory->createOperation();
oper->setNumberA(1);
oper->setNumberB(2);
double result = oper->getResult();
cout << "result="<< result << endl;
}
用工厂方法模式实现的计算器,当再扩展其他新功能时,不需要修改其他原有的代码,只需要扩展新的功能类和具体的工厂类,此模式不像简单方法模式需要修改工厂类中的逻辑判断。
这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这完全符合了开放-封闭原则的精神。
另外,工厂模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想加新功能,本来是修改工厂类的,而现在是要修改客户端。