简单工厂模式属于创建型模式,又叫静态工厂方法。
功能:通过一个简单的工厂类来封装对象的实例化过程。类图如下图所示:
运算类 为基类,加法类、减法类、乘法类、除法类 继承 运算类。
独立的一个 简单工厂类 用于实例化子类。向 createOperation() 方法传递不同的参数,会实例化不同的子类对象。实例化后的子类对象可以调用各自的 getResult() 方法,进行不同的运算。
C++代码示例:
Operation.h
#pragma once
//运算类
class Operation
{
public:
double numA; //两个操作数
double numB;
virtual double getResult(void) = 0;//获取运算结果
};
//加法类
class OperationAdd :public Operation
{
public:
double getResult(void)override;
};
//减法类
class OperationSub :public Operation
{
public:
double getResult(void)override;
};
//乘法类
class OperationMul :public Operation
{
public:
double getResult(void)override;
};
//除法类
class OperationDiv :public Operation
{
public:
double getResult(void)override;
};
//运算类型
enum operate
{
ADD,
SUB,
MUL,
DIV
};
//简单工厂类
class OperationFactory
{
public:
static Operation* creatOperate(int);//创建实例化对象。注意此方法为 静态 函数。
};
Operation.cpp
#include "Operation.h"
double OperationAdd::getResult()
{
return numA + numB; //返回两数之和
}
double OperationSub::getResult()
{
return numA - numB; //返回两数之差
}
double OperationMul::getResult()
{
return numA * numB; //返回两数的乘积
}
double OperationDiv::getResult()
{
return numA / numB; //返回A/B的值
}
//OP:实例子类的类型
Operation* OperationFactory::creatOperate(int OP)
{
Operation *oper =nullptr;
switch (OP)
{
case ADD:
oper = new OperationAdd();//创建加法类对象
break;
case SUB:
oper = new OperationSub();//创建减法类对象
break;
case MUL:
oper = new OperationMul();//创建乘法类对象
break;
case DIV:
oper = new OperationDiv();//创建除法类对象
break;
}
return oper; //返回创建的子类对象
}
main.cpp
#include <iostream>
#include "Operation.h"
using namespace std;
int main()
{
Operation *oper = NULL;
//加法运算
oper = OperationFactory::creatOperate(ADD);
oper->numA = 1;
oper->numB = 2;
cout<< oper->getResult()<<endl;
//减法运算
oper = OperationFactory::creatOperate(SUB);
oper->numA = 100;
oper->numB = 1;
cout << oper->getResult()<< endl;
//乘法运算
oper = OperationFactory::creatOperate(MUL);
oper->numA = 3;
oper->numB = 4;
cout << oper->getResult() << endl;
//除法运算
oper = OperationFactory::creatOperate(DIV);
oper->numA = 1;
oper->numB = 4;
cout << oper->getResult() << endl;
delete oper;
return 0;
}
VS中运行结果如下: