最近才开始看设计模式,想想这玩意本来应该在大学的时候就应该了解的东西,到现在了竟然只了解到皮毛,惭愧啊~~~
话说这是从一个计算器的案例来引发的思考,现在我想做一个计算器,包含加减乘除运算;
考虑下,设计这个类,一般的设想是直接设计一个运算类,里面包含加减乘除运算的接口,然后就可以完工了。
可是,真的是这样吗?如果我们想再增加一个乘方运算,怎么办呢?直接在运算类里面写?这显然违背了设计的开闭原则。而且,再想一
想,这样设计的类,耦合度想到高,如果要更改某一个运算方式,就必须再次打开运算类,这样做,估计老板要发怒的了。
于是,我们考虑一种简单工程模式,把具体的类和实现部分分开,结构图如下:
这样做,如果我们要增加新的运算,只需要增加新的运算类,然后才工厂中注册新的产品就可以了;
代码实现:
//运算基类
#include <iostream>
#ifndef OPERATION
#define OPERATION
class Operation
{
public:
virtual double GetResult(double numA, double numB);
protected:
private:
};
#endif
#include "Operation.h"
//加法类
#ifndef OPERATIONADD
#define OPERATIONADD
class OperationAdd:public Operation
{
public :
double GetResult(double numA, double numB);
protected:
private:
};
#endif
//工厂
#ifndef SIMPLEFACTORY
#define SIMPLEFACTORY
class SimpleFactory
{
public:Operation *CreatOperation(char operate);
};
#endif
//工厂的实现
Operation *SimpleFactory::CreatOperation(char operate)
{
Operation *oper = NULL;
switch (operate)
{
case '+':oper = new OperationAdd;
break;
case '-':oper = new OperationSub;
break;
case '*':oper = new OperationMul;
break;
case '/':oper = new OperationDiv;
break;
default:oper = new OperationAdd;
break;
}
return oper;
}
客户端
int main(void)
{
double numA = 20;
double numB = 13;
Operation *oper = NULL;
SimpleFactory simFac;
oper = simFac.CreatOperation('/');
double result = oper->GetResult(numA, numB);
std::cout<<"numA / numB 's result is:"<<result<<std::endl;
system("pause");
return 0;
}
说明:
/*
*优点:符合面向对象4大原则:可维护,可复用,可扩展,灵活性高,耦合度低
*缺点:如果要增加新的产品,必须对工厂进行修改,这违背了软件设计的开闭原则
*/