代码
下面既是 c++ 实现的简单工厂设计模式的代码,这里是采用例子的方法进行描述的,让你们更加易懂,例子采用的是加、减、乘、除各个不同算法的类。此设计模式主要分为三个部分:
- 工厂函数,负责生产出具体算法类,对应下面代码的 OperationFactory
- 算法类的抽象,是不同算法的基类,对应下面代码的 Operation
- 具体的算法类,算法的具体类,对应下面代码的 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;
}
详细表述
- 首先我们声明一个基类指针,给它赋值具体的算法类(抽象的使用各个具体的算法类)
- 加减乘除是二元算法,需要设置两个值,这是所有算法一样的操作,不需要改变,因此不用使用虚函数
- 每个算法类包括基类,都有一个方法 getResult 获取最后的结果,不同的算法具体的实现不一样,因此需要重写,设置为虚函数
- 工厂类接受一个字符类型参数,利用 switch 来生成不同的具体算法类按指针返回,赋给基类指针
- 然后我们使用的时候直接使用基类指针进行调用,采用运行时判断使得不同的类调用不同的虚函数 getResult 实现多态
后续
后续还有工厂模式,抽象工厂模式,可以一块食用。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于