设计模式8工厂方法模式
回顾简单工厂模式,在工厂类里判断到底需要创建哪一个类来计算结果,如果要加一个类的话,我们需要在工厂类里来增加一个if判断;
修改了原有的类,违背了开放封闭原则。
简单工厂模式代码includeiostreamusingnamespacestd;classCalc{public:virtualdoublecalc(doublenum1,doublenum2){return0;};};classAddCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classSubCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classMulCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classDivCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{if(num20){cout除数不能为0!endl;return0;}returnnum1num2;}};classCalcFactory{public:staticCalcCreateCalc(constcharop){if(op){returnnewAddCalc;}elseif(op){returnnewSubCalc;}elseif(op){returnnewMulCalc;}elseif(op){returnnewDivCalc;}else{throw;}}};intmain(intargc,charconstargv〔〕){charop;Calccalc;doublenum1,num2,result;cout请输入数字A:endl;cinnum1;cout请输入运算符(,,,):endl;cinop;cout请输入数字B:endl;cinnum2;calcCalcFactory::CreateCalc(op);resultcalccalc(num1,num2);cout两个数的运算结果为:resultendl;return0;}
下面我们将学习工厂方法模式,增加新的计算类,不需要修改原来的老代码,就能增加一个新类。
工厂方法模式代码includeiostreamusingnamespacestd;classCalc{public:virtualdoublecalc(doublenum1,doublenum2){return0;};};classAddCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classSubCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classMulCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{returnnum1num2;}};classDivCalc:publicCalc{public:doublecalc(doublenum1,doublenum2)override{if(num20){cout除数不能为0!endl;return0;}returnnum1num2;}};classCalcFactory{public:virtualCalcCreateCalc(){returnnewCalc;}};classAddCalcFactory:publicCalcFactory{public:virtualCalcCreateCalc(){returnnewAddCalc;}};classSubCalcFactory:publicCalcFactory{public:virtualCalcCreateCalc(){returnnewSubCalc;}};classMulCalcFactory:publicCalcFactory{public:virtualCalcCreateCalc(){returnnewMulCalc;}};classDivCalcFactory:publicCalcFactory{public:virtualCalcCreateCalc(){returnnewDivCalc;}};intmain(intargc,charconstargv〔〕){charop;Calccalc;doublenum1,num2,result;cout请输入数字A:endl;cinnum1;cout请输入运算符(,,,):endl;cinop;cout请输入数字B:endl;cinnum2;CalcFactoryfactory;if(op){factorynewAddCalcFactory;}elseif(op){factorynewSubCalcFactory;}elseif(op){factorynewMulCalcFactory;}elseif(op){factorynewDivCalcFactory;}else{throw;}calcfactoryCreateCalc();resultcalccalc(num1,num2);cout两个数的运算结果为:resultendl;return0;}
最重要的一点就是把判断运算符的逻辑从设计里挪到了调用的地方,从而在新增运算符时可以不用动原来写好的类,遵循了开放关闭原则。
工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
觉得不错的话可以点个赞哦,关注我,和我一起学习。
用极致设计征服强迫症用户,魅族18系列这个开学季价格有点香8月已经接近尾声,细数一番国产手机厂商还发布了不少新旗舰,当然在配置的提升的同时价格也是水涨船高。在新机价格太高的情况下,消费者不妨看看上半年的一些旗舰,价格不仅有优势,而且在……
家用空气净化器清新净化如何?生活中我们经常能见到很多业主装修完新房后放一些橘子皮,洋葱用来去去味,对于甲醛来说其实这些方法并没有什么太大的效果,不如选择家用空气净化器,部分家用净化器有去甲醛的功效,那么家……
分离瞬态都好的耳机,哪个性价比高?给大家推荐一款有线耳机WG品牌的T2,听说他号称外挂。初识它是在朋友家,虽然LOL这个游玩游戏,游戏不用你去听枪声去听脚步声,但是音效方面和语音方面就耳机表现越亮眼越好,音质能……
阿里腾讯生态互通的B面是11ampamplt1编辑导读:越来越多的迹象表明,阿里和腾讯要互通生态了。这两个分别在各自的领域做到了王者的企业,如何相互合作是否能做到112呢?本文作者认为不然,很有可能是111。为什么这么说呢……
iOS微信内测边写边译功能开启方法,亲测有效最近安卓或iOS微信基本都是同步更新,目前安卓微信已经发布了8。0。11测试版,而iOS微信已经发布了8。0。11正式版。不过根据官方显示,安卓或iOS微信的8。0。11……
xr还值得入手吗?xr还值得入手吗?手中的荣耀10和小米8se都是664的。最近总提前储存空间不足了。经济能力有限,想换台二手的机子,撑过这坚难的两年。预算2000左右的样子。近期在二手平……
自动翻译机好用吗?讯飞双屏翻译机不止会翻译在跨国会议沟通中,语言问题总是摆在人们面前的第一道难关,很多情况下需要一位译员在场才能解决这个难题。但是请翻译官不仅费用较高,有的时候还会有信息泄露的风险。此时,如果带上一台实……
天猫继续成为618绝对主场25万品牌拥抱天猫6185月20日,上半年规模最大的购物节天猫618官宣启动,天猫继续成为618绝对主场,今年将有25万品牌拥抱天猫618,达到了去年同期的2。5倍。期间将有1300万款商品上架,其中……
一文读懂特种工程塑料PEIPEI相对于其他芳族聚酰亚胺而言,是一种成本较低,产量较大的热塑性聚酰亚胺,从综合性能和性能价格比方面考察,聚醚酰亚胺是芳族聚酰亚胺改性研究中最成功的一类产品。今天我们就从制备……
夏日MojitoDC简评AampampampnormaSR2最近AK最受关注的新品无疑是SE200,脑洞大开的混合DAC(AK4499ESS9068)架构,一次性给用家两个声音风格和听音感受,无疑是一次非常有意思的尝试。而其实还有……
十日谈医疗剧拯救了你,网文拯救了医疗剧影视剧的评分有时也很迷。2017年10月底上映之初,《急诊科医生》便遭遇了口碑滑铁卢,豆瓣评分5。8跌到了及格线以下,不少人甚至表示要向上半年由业内良心正午阳光出品的《外……
arparaVR手机观影APP全新上线,沉浸体验高清巨幕观影于今年下半年正式发布的以MicroOLED高清显示和超轻量级两大特点著称的arpara5KVR头显,在近日官方为其量身定制的连接手机使用的观影APParparahome正式上线……