从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
1简单工厂模式结构图
简单工厂模式主要包含三部分
(1)工厂:负责根据客户需求创造需要的产品
(2)抽象产品:工厂生产产品的父类
(3)具体产品
2代码分析
/*设计模式学习系列之简单工厂模式
* 参考书籍《大话设计模式》
* 简单工厂模式 的主要用途:根据需求创造需要的实例
*
* 例子逻辑:两个数的各种运算
*/
#include <iostream>
using namespace std;
enum OperatorType
{
ADD = 1,
SUB,
MUL,
DIV,
};
//运算类基类
class Operation
{
public:
double numA ;
double numB ;
public:
Operation():numA(0),numB(0){}
Operation(const double& a , const double& b)
{
numA = a ;
numB = b ;
}
virtual ~Operation(){}
void SetNumA(const double& a)
{
numA = a ;
}
void SetNumB(const double& b)
{
numB = b ;
}
virtual double GetResult()
{
return 0.0f ;
}
};
//加法类
class OperationAdd: public Operation
{
double GetResult()
{
return numA + numB ;
}
};
//减法类
class OperationSub: public Operation
{
double GetResult()
{
return numA - numB ;
}
};
//乘法
class OperationMul: public Operation
{
double GetResult()
{
return numA * numB ;
}
};
//除法
class OperationDiv: public Operation
{
double GetResult()
{
if(numB == 0)
{
cout << "除数不能为0 \n" << endl ;
return 0 ;
}
return numA / numB ;
}
};
//工厂类
class Factory
{
public:
static Operation* CreateOperation(const int& type)
{
Operation * pOperation = 0 ;
//c++ Switch判断语句中只允许整形和枚举类型,即integer type:char,short,int,long,
//不建议使用float类型以及string类型
switch(type)
{
case ADD:
{
pOperation = new OperationAdd ;
}
break ;
case SUB:
{
pOperation = new OperationSub ;
}
break ;
case MUL:
{
pOperation = new OperationMul ;
}
break ;
case DIV:
{
pOperation = new OperationDiv ;
}
break ;
default:
break;
}
return pOperation ;
}
};
//===============================
#include "factory_sm.h"
int main()
{
Operation *pOpe = NULL ;
pOpe = Factory::CreateOperation(ADD);
pOpe->SetNumA(10);
pOpe->SetNumB(10);
cout << pOpe->GetResult() << endl ;
delete pOpe ; //工厂中创建了,但没释放,这是个问题
}
注意的问题:
(1)//c++ Switch判断语句中只允许整形和枚举类型,即integer type:char,short,int,long, //不建议使用float类型以及string类型
(2)上面方法中 创建类的释放是个问题,因为工厂类没有做到自动释放,需要在代码中主动释放,不是很好,不知道由什么好的方法
细雨淅淅 标签:
设计模式