接着上文简单工厂模式的问题,简单工厂模式的最大优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。比如你想产生加操作,直接把加号给工厂,工厂就产生了加类的产品。但是如果要添加新功能,比如求M数的N次方,就需要增加case分支,因此就违背了开放-封闭原则。
什么叫开放封闭原则呢?开放:也就是该模块的行为是能够被扩展的,当应用程序的需求发生变化时,我们可以使模块便显出全新的或与以往不同的行为,满足新的需求。封闭:
模块的源代码是不能被侵犯的,任何人都不能修改已有的源代码。
基于此怎么来改进呢?方法就是将工厂变为抽象工厂,预留一个接口,这个接口就是产生一个operation类,所有的具体产生相应方法的类继承自该工厂实现该接口,这样就可以在不改动源代码的情况下,增加新的功能。
什么叫开放封闭原则呢?开放:也就是该模块的行为是能够被扩展的,当应用程序的需求发生变化时,我们可以使模块便显出全新的或与以往不同的行为,满足新的需求。封闭:
模块的源代码是不能被侵犯的,任何人都不能修改已有的源代码。
基于此怎么来改进呢?方法就是将工厂变为抽象工厂,预留一个接口,这个接口就是产生一个operation类,所有的具体产生相应方法的类继承自该工厂实现该接口,这样就可以在不改动源代码的情况下,增加新的功能。
因此工厂方法模式的核心是:核心工厂类不再负责具体产品的创建,而是将创建工作交给相应的子类,核心工厂只提供接口。
#include <iostream>
#include <string>
using namespace std;
class Operation//基类存放数据,派生类实现操作,实现数据和操作分离
{
public:
double A, B;
virtual double getResult()//无论是加减乘除还是别的,都是为了实现结果
{
return 0;
}
virtual ~Operation()
{
}
};
class AddOperation :public Operation
{
public:
double getResult()
{
return A + B;
}
};
class SubOperation :public Operation
{
public:
double getResult()
{
return A - B;
}
};
class MulOperation :public Operation
{
public:
double getResult()
{
return A * B;
}
};
class DivOperation :public Operation
{
public:
double getResult()
{
if (abs(B) < 1.0e-8)
{
cout << "error" << endl;
return 0;
}
else
{
return A / B;
}
}
};
class IFactory//抽象的工厂,负责生产操作的类
{
public:
virtual Operation* createoperator() = 0;//接口
virtual ~IFactory()
{}
};
class AddIFactory:public IFactory
{
public:
static Operation* createoperator()
{
return new AddOperation();
}
};
class SubIFactory :public IFactory
{
public:
static Operation* createoperator()
{
return new SubOperation();
}
};
class MulIFactory :public IFactory
{
public:
static Operation* createoperator()
{
return new MulOperation();
}
};
class DivIFactory :public IFactory
{
public:
static Operation* createoperator()
{
return new DivOperation();
}
};
int main()
{
Operation* op = AddIFactory::createoperator();
op->A = 10;
op->B = 20;
cout << op->getResult() << endl;
delete op;
}