工厂方法模式---重写计算器(C++)
2014-01-13 20:39
501 查看
简单工厂模式和工厂模式的区别:
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,除去了与具体产品的依赖。就像计算器,让客户端不用管该用哪个类的实例,只需把'+'给工厂,工厂自动就给出了相应的实例,客户端只要做运算就可以了。但是问题也在这里,如果要增加新的运算功能,就一定需要修改这个运算工厂类,违背了开放-封闭原则。
工厂方法模式,定义一个用于创造对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
![](https://img-blog.csdn.net/20140113203305812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHdiMTAxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
[align=left] [/align]
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂模式把简单工厂的内部逻辑判断转移到了客户端代码来进行,增加功能时,需要修改客户端。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,除去了与具体产品的依赖。就像计算器,让客户端不用管该用哪个类的实例,只需把'+'给工厂,工厂自动就给出了相应的实例,客户端只要做运算就可以了。但是问题也在这里,如果要增加新的运算功能,就一定需要修改这个运算工厂类,违背了开放-封闭原则。
工厂方法模式,定义一个用于创造对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
[align=left] [/align]
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂模式把简单工厂的内部逻辑判断转移到了客户端代码来进行,增加功能时,需要修改客户端。
#include <iostream> #include <stdexcept> #include <memory> using namespace std; class Operation { protected: double numberA; double numberB; public: void GetNumberA(double value) { numberA = value; } void GetNumberB(double value) { numberB = value; } virtual double GetResult() = 0; }; class OperationAdd : public Operation { public: virtual double GetResult() { double result = numberA + numberB; return result; } }; class OperationSub : public Operation { public: virtual double GetResult() { double result = numberA - numberB; return result; } }; class OperationMul : public Operation { public: virtual double GetResult() { double result = numberA * numberB; return result; } }; class OperationDiv : public Operation { public: virtual double GetResult() { if( (-0.0000001< numberB) && (numberB < 0.0000001) ) throw exception("除数不能为0"); double result = numberA / numberB; return result; } }; /*运算符工厂类*/ class OperationFactory { public: virtual Operation* CreateOperation() = 0; //子类实现这个方法,返回具体的运算法对象 }; /*加法运算符工厂类,继承OperationFactory抽象类,实现CreateOperation方法,返回加法运算符对象*/ class AddOperationFactory : public OperationFactory { public: virtual Operation* CreateOperation() { return new OperationAdd(); } }; class SubOperationFactory : public OperationFactory { public: virtual Operation* CreateOperation() { return new OperationSub(); } }; class MulOperationFactory : public OperationFactory { public: virtual Operation* CreateOperation() { return new OperationMul(); } }; class DivOperationFactory : public OperationFactory { public: virtual Operation* CreateOperation() { return new OperationDiv(); } }; int main() { double numberA; double numberB; char operate; cout<<"请输入数字A: "; cin>>numberA; cout<<"请输入数字B: "; cin>>numberB; AddOperationFactory addfa; SubOperationFactory subfa; MulOperationFactory mulfa; DivOperationFactory divfa; OperationFactory* factory = &divfa; /* 只需替换具体的操作符对象即可 */ Operation* oper = factory->CreateOperation(); oper->GetNumberA(numberA); oper->GetNumberB(numberB); try{ cout<<oper->GetResult()<<endl; } catch(exception& e) { cout<<e.what()<<endl; } delete oper; return 0; }
相关文章推荐
- C++编程参考
- 解析VC++ Name Mangling 机制
- C/C++ static analysis: CodeViz
- C++继承中的内存分布_经典
- C/C++面试经典大全
- [C++ zip] 如何压缩一个文件夹?
- c++中RTTI的观念和使用
- C语言中的指针详解
- 小结c++中使用python时的互调
- C++里面定时器的使用
- C++Builder如何将当前时间与字符串相互转换
- C/C++笔试题-主要考察C/C++语言基础概念、算法及编程,附参考答案,分享给大家。
- C++ 写入注册表
- C++和操作系统面试问题分类
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
- Effective C++ 8. 定制 new 和 delete
- c++函数指针、虚继承大小、类型转换、C特殊情况记录
- C++函数重载在MFC中的体现
- c语言日志工具-zlog的使用
- C++模板 typename跟class的区别