代码
下面既是c++实现的简单工厂设计模式的代码,这里是采用例子的方法进行描述的,让你们更加易懂,例子采用的是加、减、乘、除各个不同算法的类。此设计模式主要分为三个部分:
- 工厂函数,负责生产出具体算法类,对应下面代码的 O p e r a t i o n F a c t o r y OperationFactory OperationFactory
- 算法类的抽象,是不同算法的基类,对应下面代码的 O p e r a t i o n Operation Operation
- 具体的算法类,算法的具体类,对应下面代码的 O p e r a t i o n A d d , O p e r a t i o n S u b , O p e r a t i o n M u l , O p e r a t i o n D i v OperationAdd,OperationSub,OperationMul,OperationDiv OperationAdd,OperationSub,OperationMul,OperationDiv
#include <iostream>
#include <string>
using std::string;
class Operation
{
protected:
double numberA;
double numberB;
public:
Operation():numberA(0),numberB(0){};
Operation(double A,double B):numberA(A),numberB(B){};
void setA(double A){numberA = A;};
void setB(double B){numberB = B;};
virtual double getResult() = 0;
};
class OperationAdd : public Operation
{
public:
virtual double getResult(){return numberA + numberB;};
};
class OperationSub : public Operation
{
public:
virtual double getResult(){return numberA - numberB;};
};
class OperationMul : public Operation
{
public:
virtual double getResult(){return numberA * numberB;};
};
class OperationDiv : public Operation
{
public:
virtual double getResult(){return numberA / numberB;};
};
class OperationFactory
{
public:
static Operation * creatOperation(int operation)
{
Operation *result = nullptr;
switch(operation)
{
case '+':
result = new OperationAdd();
break;
case '-':
result = new OperationSub();
break;
case '*':
result = new OperationMul();
break;
case '/':
result = new OperationDiv();
break;
}
return result;
}
};
int main()
{
Operation *oper = nullptr;
oper = OperationFactory::creatOperation('/');
oper->setA(9);
oper->setB(8);
std::cout<<oper->getResult()<<"\n";
delete oper;
return 0;
}
详细表述
- 首先我们声明一个基类指针,给它赋值具体的算法类(抽象的使用各个具体的算法类)
- 加减乘除是二元算法,需要设置两个值,这是所有算法一样的操作,不需要改变,因此不用使用虚函数
- 每个算法类包括基类,都有一个方法 g e t R e s u l t getResult getResult获取最后的结果,不同的算法具体的实现不一样,因此需要重写,设置为虚函数
- 工厂类接受一个字符类型参数,利用 s w i t c h switch switch来生成不同的具体算法类按指针返回,赋给基类指针
- 然后我们使用的时候直接使用基类指针进行调用,采用运行时判断使得不同的类调用不同的虚函数 g e t R e s u l t getResult getResult实现多态
后续
后续还有工厂模式,抽象工厂模式,可以一块食用。