工厂方法模式
运用简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件同态实例化相关的类,对客户端来说,去除了与具体产品的依赖
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代来进行,想要加功能,本来是要修改工厂类的,然后修改客户端就行了。
- 抽象工厂类
抽象工厂类中定义具体工厂调用的接口 - 抽象产品类
抽象产品类中定义具体产品的调用接口 - 具体工厂类
实现不同的产品的生产 - 具体产品类
实现产品的功能
工厂方法模式的优缺点:
优点:
#include <iostream>
using namespace std;
//工厂方法类
//抽象产品类
template<typename T>
class Base
{
public:
virtual T operation(T a,T b) = 0;
};
//具体产品类
template<typename T>
class Add:public Base<T>
{
public:
T operation(T a,T b)
{
return a + b;
}
};
template<typename T>
class Sub:public Base<T>
{
public:
T operation(T a,T b)
{
return a - b;
}
};
template<typename T>
class Mul:public Base<T>
{
public:
T operation(T a,T b)
{
return a * b;
}
};
template<typename T>
class Div:public Base<T>
{
public:
T operation(T a,T b)
{
if(b == 0)
{
throw "除数为0";
}
return a / b;
}
};
//抽象工厂类
template<typename T>
class Factory
{
public:
virtual Base<T> *createOperation() = 0;
};
//具体工厂类
template<typename T>
class AddFactoty: public Factory<T>
{
public:
Base<T> *createOperation()
{
return new Add<T>();
}
};
template<typename T>
class SubFactoty: public Factory<T>
{
public:
Base<T> *createOperation()
{
return new Sub<T>();
}
};
template<typename T>
class MulFactoty: public Factory<T>
{
public:
Base<T> *createOperation()
{
return new Mul<T>();
}
};
template<typename T>
class DivFactoty: public Factory<T>
{
public:
Base<T> *createOperation()
{
return new Div<T>();
}
};
int main()
{
Factory<int> *oper = new AddFactoty<int>();//创建一个加法工厂
Base<int> *ADD = (Add<int> *)oper->createOperation();
cout << ADD->operation(20,10) << endl;
return 0;
}