设计模式8工厂方法模式
回顾简单工厂模式,在工厂类里判断到底需要创建哪一个类来计算结果,如果要加一个类的话,我们需要在工厂类里来增加一个if判断;
修改了原有的类,违背了开放封闭原则。
简单工厂模式代码 #include using namespace std; class Calc { public: virtual double calc(double num1, double num2) { return 0; }; }; class AddCalc : public Calc { public: double calc(double num1, double num2) override { return num1 + num2; } }; class SubCalc : public Calc { public: double calc(double num1, double num2) override { return num1 - num2; } }; class MulCalc : public Calc { public: double calc(double num1, double num2) override { return num1 * num2; } }; class DivCalc : public Calc { public: double calc(double num1, double num2) override { if (num2 == 0) { cout << "除数不能为0!" << endl; return 0; } return num1 / num2; } }; class CalcFactory { public: static Calc* CreateCalc(const char op) { if (op == "+") { return new AddCalc; } else if (op == "-") { return new SubCalc; } else if (op == "*") { return new MulCalc; } else if (op == "/") { return new DivCalc; } else { throw; } } }; int main(int argc, char const* argv[]) { char op; Calc *calc; double num1, num2, result; cout << "请输入数字A: " << endl; cin >> num1; cout << "请输入运算符(+, -, *, /):" << endl; cin >> op; cout << "请输入数字B: " << endl; cin >> num2; calc = CalcFactory::CreateCalc(op); result = calc->calc(num1, num2); cout << "两个数的运算结果为: " << result << endl; return 0; }
下面我们将学习工厂方法模式,增加新的计算类,不需要修改原来的老代码,就能增加一个新类。
工厂方法模式代码 #include using namespace std; class Calc { public: virtual double calc(double num1, double num2) { return 0; }; }; class AddCalc : public Calc { public: double calc(double num1, double num2) override { return num1 + num2; } }; class SubCalc : public Calc { public: double calc(double num1, double num2) override { return num1 - num2; } }; class MulCalc : public Calc { public: double calc(double num1, double num2) override { return num1 * num2; } }; class DivCalc : public Calc { public: double calc(double num1, double num2) override { if (num2 == 0) { cout << "除数不能为0!" << endl; return 0; } return num1 / num2; } }; class CalcFactory { public: virtual Calc* CreateCalc() { return new Calc; } }; class AddCalcFactory : public CalcFactory { public: virtual Calc* CreateCalc() { return new AddCalc; } }; class SubCalcFactory : public CalcFactory { public: virtual Calc* CreateCalc() { return new SubCalc; } }; class MulCalcFactory : public CalcFactory { public: virtual Calc* CreateCalc() { return new MulCalc; } }; class DivCalcFactory : public CalcFactory { public: virtual Calc* CreateCalc() { return new DivCalc; } }; int main(int argc, char const* argv[]) { char op; Calc *calc; double num1, num2, result; cout << "请输入数字A: " << endl; cin >> num1; cout << "请输入运算符(+, -, *, /):" << endl; cin >> op; cout << "请输入数字B: " << endl; cin >> num2; CalcFactory *factory; if (op == "+") { factory = new AddCalcFactory; } else if (op == "-") { factory = new SubCalcFactory; } else if (op == "*") { factory = new MulCalcFactory; } else if (op == "/") { factory = new DivCalcFactory; } else { throw; } calc = factory->CreateCalc(); result = calc->calc(num1, num2); cout << "两个数的运算结果为: " << result << endl; return 0; }
最重要的一点就是把判断运算符的逻辑从设计里挪到了调用的地方,从而在新增运算符时可以不用动原来写好的类,遵循了开放关闭原则。
工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
觉得不错的话可以点个赞哦,关注我,和我一起学习。
我的日记老妈篇2021年7月16日,吃过晚饭,碗筷洗涮完毕,觉得无事可做,就提前开始了今天的日记。进入伏天后,昼夜温差小了,空气的湿度大了,一天下来,身上总是潮乎乎儿的,要是睡前不冲个澡就无法上
我的日记老妈篇2021年7月15日,早上5点多点起床,开始了第二天的老妈管护工作。头天晚上把米洗完下锅预约好了,早上用几天前吃剩的扣肉炖个茄子,每人再吃一个煮鸡蛋这就是我和老妈的早餐,比较简单,
我的日记老妈篇2021年7月14日,今天开始,我要正式接手一份新的工作一一24小时全天候看管我的老妈。说起这件事的缘由(可能是小脑委缩记忆变差的缘故,老妈走丢了18个小时,非常揪心的18个小时,
2021游戏党的福音HAKIISWIFT如今王者荣耀,刺激战场等诸多竞技手游已经成为了年轻一代的不可或缺的娱乐游戏。然而想要更好的体验游戏世界除了要有一块高性能的手机之外,当然你还需要一款专业的游戏耳机来为你提供更好的游
专为游戏打造西圣Olaf无线耳机相信手游已经占据了现在大部分年轻人娱乐游戏的大市场,已经代替了网游跟PC的时代。竞技类手游时代更是火热,如果你想在吃鸡王者等竞技类手游里快人一步,拥有更快延时更低的游戏体验那么今天
全球领先2023年量产长城汽车智慧线控底盘技术首次公开10月28日,长城汽车咖啡智能2。0智慧线控底盘公开课正式线上开讲。据了解,长城汽车智慧线控底盘是以L4级及以上自动驾驶的目标来搭建的技术平台,于今年6月长城汽车第8届科技节上全球
图像显示高要求,工业一体机分辨率是医疗彩超设备选择第一要素?互联网信息时代的发展,让许多行业发生了翻天覆地的改变。其中,医疗行业作为国民经济重要支柱之一,科技发展带来了智慧医疗的全新征程,全面建设智慧医疗体系成为当前各大医院的共同目标。通过
分辨率要求19201080,智慧港口对工业安卓一体机为何有这需求?港口是水陆交通的集结点和枢纽处,是工农业产品和外贸进出口物资的集散地,也是船舶停泊装卸货物上下旅客补充给养的重要场地,在经济发展中占据重要位置。随着信息技术的发展,以信息物理系统为
当手机厂商开始做电竞游戏手机时,请思考,你真的需要吗?智能手机市场的发展趋势早已多样化,同时也划分成了各式不同种类的区域,手机不再只作为打电话聊天上网的通讯工具,可玩性和专业性被大大提高。例如较常见的拍照手机音乐手机等等,这类特定主打
配备320Hz采样率双游戏肩键,红魔5S即将登陆骁龙865Plus阵营7月21日上午,红魔游戏手机官方在微博中宣布,新品红魔5S定档7月28日风暴降临,冰封银翼,比快更快!散热一直是红魔手机值得骄傲的优势点,虽然一直处于行业领先的散热技术,但红魔5S
2020世界人工智能大会,AI虚拟家园是什么操作?2020年7月9日,2020世界人工智能大会云端峰会在上海正式启幕!峰会围绕智联世界共同家园的主题,聚焦AI技术趋势AI赋能经济AI温暖家园三大议题。由于疫情影响,本次大会线上部分