今天学了大话设计模式,书中第一章讲述了简单工厂模式,用的是C#来描述,于是我在学习之余将书中描述的内容以C++的形式重写一遍,以作加深自己的学习印象。
首先什么是“简单工厂模式”,应该是:用一个单独的类来做创造实例的过程。(大话设计模式P10)
书中用到的例子是小型的计算器,对应有多种操作算符。等待输入操作数和操作算符以后,根据输入的符号来生产用于计算的操作,这就是这次“简单工厂模式”的应用。
以下是我用C++描述的代码:
为简便我省略掉头文件和命名空间的声明。
//操作算符的抽象类 class Operation { public: double numberA; //2个操作数 double numberB; virtual double GetResult() const = 0; //用于计算的操作 };
以下分别是加法“+”、减法“-”、乘法“*”和除法“/”的操作定义
//加法 class OperationAdd : public Operation { public: double GetResult() const { return numberA + numberB; } }; //减法 class OperationSub : public Operation { public: double GetResult() const { return numberA - numberB; } }; //乘法 class OperationMul : public Operation { public: double GetResult() const { return numberA * numberB; } }; //除法,考虑到除数可能为0的情况,这里利用标准库的数值类numeric_limits<>来输出double的最大值。 class OperationDiv : public Operation { public: double GetResult() const { if (numberB == 0) return numeric_limits<double>::max(); else return numberA / numberB; } };
操作算符都定义好以后,我们开始工厂类。
//工厂类 class OperationFactory { public: static Operation* createOperation(char c) { switch (c) { case '+': return new OperationAdd(); case '-': return new OperationSub(); case '*': return new OperationMul(); case '/': return new OperationDiv(); }//利用switch来检测输入了哪个操作算符 } };
现在我们在客户端中测试一下以上的类。
int main() { //为了方便,以下都是没有检测输入的结果是否正确 double numberA = 0, numberB = 0; char oper; cout << "请输入第一个操作数: "; cin >> numberA; cout << "请输入操作算符:"; cin >> oper; cout << "请输入第二个操作数: "; cin >> numberB; //利用工厂类的静态方法创建出操作算符的对象 Operation *operation = OperationFactory::createOperation(oper); operation->numberA = numberA; operation->numberB = numberB; //利用算符对象的方法得出结果 cout << "结果为:" << operation->GetResult() << endl; return 0; }
测试结果:
相应的UML类图是:
其实这样子把操作算符封装起来也有助于我们修改:
1、当我们需要修改除法或其他已有算法时,只需要修改相应的操作算法类即可,不必涉及到其他的操作。
2、当我们需要添加新的算法时,只需要提添加相应的新类,和在工厂类中增添switch,便可以轻松修改功能。