今天看完设计模式的第一节,工厂模式。现在将源代码写下,记录每一个脚印。
工厂模式:用一个工厂类管理其他类。这样代码的灵活性更强。
#include <QtCore/QCoreApplication>
#include <iostream>
#include <algorithm>
using namespace std;
//计算类的基类,所有新计算方式都继承本类,可以让程序灵活性更强。
class Calculate
{
public:
Calculate(){}
Calculate(const double& PreOperation,const double& BackOperation):
PreOperation(PreOperation),BackOperation(BackOperation){}
virtual inline double GetResult() const = 0;
protected:
double PreOperation;
double BackOperation;
};
//计算类的子类:加法类
class CalculateAdd:public Calculate
{
public:
CalculateAdd(const double& PreOperation,const double& BackOperation):
Calculate(PreOperation,BackOperation){}
virtual ~CalculateAdd(){}
inline double GetResult() const {return PreOperation + BackOperation; }
};
//计算类的子类:减法类
class CalculateSubstraction:public Calculate
{
public:
CalculateSubstraction(const double& PreOperation,const double& BackOperation):
Calculate(PreOperation,BackOperation){}
virtual ~CalculateSubstraction(){}
inline double GetResult() const {return PreOperation - BackOperation; }
};
//工厂类,管理所有计算的类
class CalculateFactory
{
public:
inline CalculateFactory(char Operation):Operation(Operation){}
double GetResult(const double& PreOperation,const double& BackOperation)
{
switch(Operation)
{
case '+':
p = new CalculateAdd(PreOperation,BackOperation);
return p->GetResult();
break;
case '-':
p = new CalculateSubstraction(PreOperation,BackOperation);
return p->GetResult();
break;
default:
cout<<"操作数有问题"<<endl;
break;
}
return 0;
}
virtual ~CalculateFactory()
{
if( p != NULL )
delete p;
}
private:
char Operation; //运算符
Calculate *p;
};
//函数对象
class FunctionObject
{
public:
FunctionObject(){}
bool operator()(const char& s)
{
if( '+' == s || '-' == s)
return true;
return false;
}
};
//输入处理类,对用户输入的字符串进行处理,也可以写子类,添加新的解析方式。
class InputOperation
{
public:
InputOperation(){}
InputOperation(string InputString):InputString(InputString)
{
InputOperationAnalysis();
}
virtual ~InputOperation(){}
inline double GetPreOperation() const {return PreOperation; }
inline double GetBackOperation() const { return BackOperation; }
inline char GetOperation() const {return Operation;}
private:
string InputString;
char Operation;
double PreOperation; //前操作数
string PreOperationString; //前操作数的string类型
double BackOperation; //后操作数
string BackOperationString; //前操作数的string类型
virtual void InputOperationAnalysis()
{
if( InputString.empty() )
return;
string::iterator StringIter = find_if(InputString.begin(),InputString.end(),FunctionObject());
Operation = (*StringIter);
for( string::iterator Iter = InputString.begin(); Iter != StringIter; ++Iter)
PreOperationString.push_back((*Iter));
for( string::iterator Iter = StringIter + 1; Iter != InputString.end(); ++Iter)
BackOperationString.push_back((*Iter));
PreOperation = atof(PreOperationString.c_str());
BackOperation = atof(BackOperationString.c_str());
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
string OperationException;
cout<<"请输入表达式:";
cin>>OperationException;
InputOperation *ino = new InputOperation(OperationException);
CalculateFactory *calf = new CalculateFactory(ino->GetOperation());
cout<<"结果是:"<<calf->GetResult(ino->GetPreOperation(),ino->GetBackOperation())<<endl;
return a.exec();
}