工厂模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
//Operation.h
#ifndef _OPERATION_H_
#define _OPERATION_H_
class Operation
{
public:
virtual double GetResult()=0;
public:
double _num1,_num2;
};
class OperationAdd:public Operation
{
public:
double GetResult();
};
class OperationSub:public Operation
{
public:
double GetResult();
};
class OperationMul:public Operation
{
public:
double GetResult();
};
class OperationDiv:public Operation
{
public:
double GetResult();
};
#endif
//Operation.cpp
#include "Operation.h"
#include <iostream>
#include <iostream>
using namespace std;
double OperationAdd::GetResult()
{
return _num1+_num2;
}
double OperationSub::GetResult()
{
return _num1-_num2;
}
double OperationMul::GetResult()
{
return _num1*_num2;
}
double OperationDiv::GetResult()
{
if (!_num2)
{
return _num1/_num2;
}
else
cout<<"除数不能为0"<<endl;
return 0;
}
//Factory.h
#ifndef _FACTORY_H
#define _FACTORY_H
class Operation;
class OperationFactory
{
public:
virtual Operation* CreateOperation()=0;
};
class AddFactory:public OperationFactory
{
Operation* CreateOperation();
};
class SubFactory:public OperationFactory
{
Operation* CreateOperation();
};
class MulFactory:public OperationFactory
{
Operation* CreateOperation();
};
class DivFactory:public OperationFactory
{
Operation* CreateOperation();
};
#endif
//Factory.cpp
#include "Operation.h"
#include "Factory.h"
Operation* AddFactory::CreateOperation()
{
return new OperationAdd();
}
Operation* SubFactory::CreateOperation()
{
return new OperationSub();
}
Operation* MulFactory::CreateOperation()
{
return new OperationMul();
}
Operation* DivFactory::CreateOperation()
{
return new OperationDiv();
}
//main.cpp
#include <iostream>
#include "Factory.h"
#include "Operation.h"
using namespace std;
int main()
{
char operate;
double numA;
double numB;
Operation* op=NULL;
OperationFactory* of= NULL;
cout<<"请输入数字1:";
cin>>numA;
cout<<"请输入运算符:";
cin>>operate;
cout<<"请输入数字2:";
cin>>numB;
switch(operate)
{
case '+':of = new AddFactory();break;
case '-':of = new SubFactory();break;
case '*':of = new MulFactory();break;
case '/':of = new DivFactory();break;
default:cout<<"算符输入错误!"<<endl;
return 0;
}
op = of->CreateOperation();
op->_num1 = numA;
op->_num2 = numB;
double result = op->GetResult();
cout<<result;
return 0;
}