设计模式之简单工厂

本贴最后更新于 567 天前,其中的信息可能已经时移世异

代码

下面既是 c++ 实现的简单工厂设计模式的代码,这里是采用例子的方法进行描述的,让你们更加易懂,例子采用的是加、减、乘、除各个不同算法的类。此设计模式主要分为三个部分:

  1. 工厂函数,负责生产出具体算法类,对应下面代码的 OperationFactory
  2. 算法类的抽象,是不同算法的基类,对应下面代码的 Operation
  3. 具体的算法类,算法的具体类,对应下面代码的 OperationAdd,OperationSub,OperationMul,OperationDiv
#include <iostream> #include <string> using std::string; class Operation { protected: double numberA; double numberB; public: Operation():numberA(0),numberB(0){}; Operation(double A,double B):numberA(A),numberB(B){}; void setA(double A){numberA = A;}; void setB(double B){numberB = B;}; virtual double getResult() = 0; }; class OperationAdd : public Operation { public: virtual double getResult(){return numberA + numberB;}; }; class OperationSub : public Operation { public: virtual double getResult(){return numberA - numberB;}; }; class OperationMul : public Operation { public: virtual double getResult(){return numberA * numberB;}; }; class OperationDiv : public Operation { public: virtual double getResult(){return numberA / numberB;}; }; class OperationFactory { public: static Operation * creatOperation(int operation) { Operation *result = nullptr; switch(operation) { case '+': result = new OperationAdd(); break; case '-': result = new OperationSub(); break; case '*': result = new OperationMul(); break; case '/': result = new OperationDiv(); break; } return result; } }; int main() { Operation *oper = nullptr; oper = OperationFactory::creatOperation('/'); oper->setA(9); oper->setB(8); std::cout<<oper->getResult()<<"\n"; delete oper; return 0; }

详细表述

  1. 首先我们声明一个基类指针,给它赋值具体的算法类(抽象的使用各个具体的算法类)
  2. 加减乘除是二元算法,需要设置两个值,这是所有算法一样的操作,不需要改变,因此不用使用虚函数
  3. 每个算法类包括基类,都有一个方法 getResult 获取最后的结果,不同的算法具体的实现不一样,因此需要重写,设置为虚函数
  4. 工厂类接受一个字符类型参数,利用 switch 来生成不同的具体算法类按指针返回,赋给基类指针
  5. 然后我们使用的时候直接使用基类指针进行调用,采用运行时判断使得不同的类调用不同的虚函数 getResult 实现多态

后续

后续还有工厂模式,抽象工厂模式,可以一块食用。

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...