简单工厂模式

来源:互联网 发布:淮南安广网络营业厅 编辑:程序博客网 时间:2024/06/11 06:04

问题:现在实现一个计算器功能,输入两个数和操作符,求两个数操作之后的结果。

于是可以有这样一份代码:

switch (ch){case '+':...}

改进:使用面向对象的思想,让操作和实现分离,从而使得程序更加灵活,容易修改,并且易于复用。
设计出这样的一个类:
class operation{public:int getresult(int a, int b, char ch){int c = 0;switch (ch){case '+':c = a + b;break;....}return c;}};
优点:实现了操作和实现的分离。缺点:仅仅用到了面对对象三大特征中的封装这一个特性,没有用到多态和继承;如果要增加新功能就得大改代码,重新编译,这是很不划算的。改进方法:无论是加减乘除还是其他新的操作,归结起来都是对两个数进行操作,得到一个结果,因此可以定义一个操作,加减乘除操作都是继承该操作。
#include <iostream>#include <string>using namespace std;class Operation{public:double A, B;virtual double  getResult()//{return 0;}virtual ~Operation(){}};class AddOperation :public Operation{public:double getResult(){return A + B;}};class SubOperation :public Operation{public:double getResult(){return A - B;}};class MulOperation :public Operation{public:double getResult(){return A * B;}};class DivOperation :public Operation{public:double getResult(){if (abs(B) < 1.0e-8){cout << "error" << endl;return 0;}else{return A / B;}}};class OperationFactory{public: static Operation* createoperator(char ch){switch (ch){case '+':return new AddOperation();break;case '-':return new SubOperation();break;case '*':return new MulOperation();break;case '/':return new DivOperation();break;default:break;}return nullptr;}};int main(){Operation* op = OperationFactory::createoperator('+');op->A = 10;op->B = 20;cout << op->getResult() << endl;delete op;}