您的位置:首页 > 其它

设计模式学习系列4 简单工厂模式

2013-11-05 23:52 621 查看
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(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)上面方法中 创建类的释放是个问题,因为工厂类没有做到自动释放,需要在代码中主动释放,不是很好,不知道由什么好的方法

细雨淅淅 标签: 设计模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: