设计模式之工厂模式

来源:互联网 发布:海康网络摄像机键盘 编辑:程序博客网 时间:2024/06/05 04:39

简单工厂模式

  主要用于创建对象。新添加类时,不会影响以前的系统代码。其核心思想是:用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。

  GOOD:适用于不同情况创建不同的类时。

        BUG:客户端必须要知道基类和工厂类,耦合性差。

下面以加减乘除算法运算符为例。


#include <iostream>
//#include <math.h>
using namespace std;
//基类
class COperation
{
public:
COperation(double _a, double _b):m_nFirst(_a),m_nSecond(_b)
{}
double getFirst() { return m_nFirst; }
double getSecond() { return m_nSecond; }
virtual double GetResult()
{
double dResult=0.0;
return dResult;
}
private:
double m_nFirst;
double m_nSecond;

};
//加法
class AddOperation : public COperation
{


public:
AddOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return this->getFirst()+this->getSecond();
}
};
//减法
class SubOperation : public COperation
{
public:
SubOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return getFirst()-getSecond();
}
};
//乘法
class MulOperation : public COperation
{
public:
MulOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return getFirst()*getSecond();
}
};
//除法
class DivOperation : public COperation
{
public:
DivOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
if(fabs(getSecond())<= 1e-7)
{
cout<<"the second number is meaningless,please check"<<endl;
return 0;
}
else
{
return getFirst()/getSecond();
}
}
};
//工厂类
class CCalculatorFactory
{
public:
static COperation* Create(double _a,double _b,char cOperator);
};

COperation* CCalculatorFactory:: Create(double _a,double _b,char cOperator)
{
COperation *oper;
    //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
switch (cOperator)
{
case '+':
oper=new AddOperation(_a,_b);
break;
case '-':
oper=new SubOperation(_a,_b);
break;
case '*':
oper=new MulOperation(_a,_b);
break;
case '/':
oper = new DivOperation(_a,_b);
break;
default:
oper=new AddOperation(_a,_b);
break;
}
return oper;
}

int main()
{
double a,b;
char c;
cout<<"Please input a:"<<endl;
cin>>a;
cout<<"a="<<a<<endl;
cout<<"Please input b:"<<endl;
cin>>b;
cout<<"Please input operaton:"<<endl;
cin>>c;
COperation * op=CCalculatorFactory::Create(a,b,c);
cout<<op->GetResult()<<endl;
return 0;
}

0 0
原创粉丝点击