工厂设计模式ppt课件.ppt

上传人:小飞机 文档编号:1911267 上传时间:2022-12-25 格式:PPT 页数:20 大小:1.23MB
返回 下载 相关 举报
工厂设计模式ppt课件.ppt_第1页
第1页 / 共20页
工厂设计模式ppt课件.ppt_第2页
第2页 / 共20页
工厂设计模式ppt课件.ppt_第3页
第3页 / 共20页
工厂设计模式ppt课件.ppt_第4页
第4页 / 共20页
工厂设计模式ppt课件.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《工厂设计模式ppt课件.ppt》由会员分享,可在线阅读,更多相关《工厂设计模式ppt课件.ppt(20页珍藏版)》请在三一办公上搜索。

1、Java设计模式,工厂设计模式,理解并会使用EL理解并会使用常用的JSTL标签,本章目标,面试,请用C+,Java,C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果?,小菜今年计算机专业大四,一心想找份好工作,投了无数份简历后,终于得到一个面试机会。小菜三下五除二写完了代码仔细检查后没有发现错误交卷后,单位通知他一周内等消息,小菜代码,Scanner in=new Scanner(System.in);System.out.println(请输入数字A:);String A=in.next();System.out.println(请选择运算符

2、号(+、=、*、/):);String B = in.next(); System.out.println(请输入数字B:);String C = in.next(); String D = ; if (B.equals(+) D =String.valueOf(Double.parseDouble(A) + Double.parseDouble(C); if (B.equals(-) D = String.valueOf(Double.parseDouble(A) - Double.parseDouble(C); if (B.equals(*) D = String.valueOf(Doub

3、le.parseDouble(A) * Double.parseDouble(C); if (B.equals(/) D = String.valueOf(Double.parseDouble(A) / Double.parseDouble(C); System.out.println(结果是: + D);,面试受挫,一个月后仍然没有消息,我的代码实现了啊,怎么不给我机会?,寻求帮助,小菜找到从事软件开发工作7年的表哥大鸟请教大鸟问了题目和了解小菜的代码后哈哈大笑:”你上当了,人家单位出题的意思,你完全没有明白”,初学者代码毛病,大鸟说:首先现在的代码需要改进的地方有很多。,Scanner i

4、n=new Scanner(System.in);System.out.println(请输入数字A:);String A=in.next();System.out.println(请选择运算符号(+、=、*、/):);String B = in.next(); System.out.println(请输入数字B:);String C = in.next(); String D = ; if (B.equals(+) D =String.valueOf(Double.parseDouble(A) + Double.parseDouble(C); if (B.equals(-) D = Stri

5、ng.valueOf(Double.parseDouble(A) - Double.parseDouble(C); if (B.equals(*) D = String.valueOf(Double.parseDouble(A) * Double.parseDouble(C); if (B.equals(/) D = String.valueOf(Double.parseDouble(A) / Double.parseDouble(C); System.out.println(结果是: + D);,命名不规范,判断分支,这样写意味着程序做了三次无用功.,除数为0或除数是字符串怎么办?,代码规范

6、,Scanner in = new Scanner(System.in);System.out.println(请输入数字A:);String strNumberA = in.next();System.out.println(请选择运算符号(+、=、*、/):);String strOperate = in.next();System.out.println(请输入数字B:);String strNumberB = in.next();String strResult = ;try if (strOperate.equals(+)strResult = String.valueOf(Doub

7、le.parseDouble(strNumberA)+ Double.parseDouble(strNumberB);else if (strOperate.equals(-)strResult = String.valueOf(Double.parseDouble(strNumberA)- Double.parseDouble(strNumberB);else if (strOperate.equals(*)strResult = String.valueOf(Double.parseDouble(strNumberA)* Double.parseDouble(strNumberB);els

8、e if (strOperate.equals(/) Double d = Double.parseDouble(strNumberB);if (d != 0) strResult = String.valueOf(Double.parseDouble(strNumberA)/ Double.parseDouble(strNumberB); else strResult = 除数为零!;System.out.println(结果是: + strResult); catch (Exception e) System.out.println(输入有误);,面向对象,小菜按照大鸟的建议改写了代码?可

9、是这样写出的代码是否符合出题人的意思呢?,任意一种面向对象语言。使用面向对象的编程方法实现,面向对象,所有初学者都会有这样的问题。碰到问题就直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。用计算机的方式去思考比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需求。,不容易维护不容易扩展不容易复用,如何才能容易维护,容易扩展,又容易复用呢?,活字印刷 面向对象,喝酒唱歌,人生真爽,,这里面问题出在哪呢?,话说三国时期,曹操带领百万大军攻打东吴,对酒当歌,人生真爽,,对酒当歌

10、,人生几何?,三国时期活字印刷还未发明,活字印刷 面向对象,喝 酒 唱 歌, 人 生 真 爽,,如果有了活字印刷,只需要改4个字,要改,只需更改要改的字可维护,对,当,几,何,字并非用完就无用,可以在以后印刷中重复使用可复用,此诗若要加字,只需另外刻字加入可扩展,字的排列其实可能是竖排或横排,只需移动字的位置就可灵活性好,程序开发有太多类似曹操这样的客户,不断的更改需求,客户要求也不份,不就是改几个字吗?面对已完成的程序代码,修改几个字都有可能需要重头再来,实在痛苦。,灵活利用面向对象三大特性,来完善程序,面向对象,如果现在我们再写一个Windows的计算器,那么前面的代码能否复用?,复制代码

11、,初级程序员的工作就是Ctrl+C,Ctrl+V代码越多时,维护就麻烦尽量减少重复前面代码有多少和控制台无关,而只是和计算器有关?,业务封装,业务逻辑与界面逻辑分开,只有分离才可以达到容易维护或扩展。单独分离出一个类:Operation 运算类,Operation类 主要用于计算,与界面等无关不单控制台程序能用,Swing能用,Web程序同意能用三个参数,两个为输入数,一个为操作符,业务封装,public class Operation public static double GetResult(String strNumberA, String strNumberB,String strO

12、perate) double strResult = 0d;try if (strOperate.equals(+) strResult = (Double.parseDouble(strNumberA) + Double.parseDouble(strNumberB);else if (strOperate.equals(-) strResult = (Double.parseDouble(strNumberA) - Double.parseDouble(strNumberB);else if (strOperate.equals(*) strResult = (Double.parseDo

13、uble(strNumberA) * Double.parseDouble(strNumberB);else if (strOperate.equals(/) Double d = Double.parseDouble(strNumberB);if (d != 0) strResult = (Double.parseDouble(strNumberA) / Double.parseDouble(strNumberB); else strResult = 0; catch (Exception e) strResult = 0; return strResult;,Scanner in = ne

14、w Scanner(System.in);System.out.println(请输入数字A:);String strNumberA = in.next();System.out.println(请选择运算符号(+、=、*、/):);String strOperate = in.next();System.out.println(请输入数字B:);String strNumberB = in.next();Double strResult = Operation.GetResult(strNumberA, strNumberB, strOperate);System.out.println(结

15、果是: + strResult);,Operation,控制台,现在是完全面向对象吗?只用了面向对象三大特性中的一个:封装 继承?多态?,else if(strOperate.equals(max)strResult=Math.max(Double.parseDouble(strNumberA) , Double.parseDouble(strNumberB);,弊端与问题:1.整个运算类都要参与编译2.万一其它运算被你修改,而没有发现问题?3.不同程序员同时在增加新的运算算法,怎么办?,继承,利用继承,重新编写Operation 类,,Operation类 为基类,充当接口的角色拥有两个属性

16、,分别保存操作数和被操作数NumberANumberB拥有一个方法,此方法为虚方法,能被重写(因为不同运算会有不同的算法返回不同的值),返回运算值。virtual double GetResult(),继承,public class Operation protected double numberA = 0;protected double numberB = 0;public double getNumberA() return numberA;public void setNumberA(double numberA) this.numberA = numberA;public doub

17、le getNumberB() return numberB;public void setNumberB(double numberB) this.numberB = numberB;public double GetResult() double result = 0;return result;,Operation 类 基类,/加法类,继承运算类 class OperationAdd extends Operation public double GetResult() double result = 0; result = NumberA + NumberB; return resul

18、t; ,/减法类,继承运算类 class OperationSub extends Operation public double GetResult() double result = 0; result = NumberA - NumberB; return result; ,其它的运算算法类.,多态,利用多态,来实现到底要实例化谁,单独用一个类来实现创造实例的过程,这就是工厂。,OperationFactory 充当实例化的工厂,通过这个类利用多态来实例化运算算法类这个工厂比较简单,返回统一的父类即Operation类。,public class OperationFactory pub

19、lic static Operation createOperate(String operate) Operation oper = null; if(operate.equals(+) oper = new OperationAdd(); else if(operate.equals(-) oper = new OperationSub(); return oper; ,Scanner in = new Scanner(System.in);System.out.println(请输入数字A:);String strNumberA = in.next();System.out.printl

20、n(请选择运算符号(+、=、*、/):);String strOperate = in.next();System.out.println(请输入数字B:);String strNumberB = in.next();try Operation opr = OperationFactory.createOperate(strOperate);opr.setNumberA(Double.parseDouble(strNumberA);opr.setNumberB(Double.parseDouble(strNumberB);double strResult = opr.GetResult();S

21、ystem.out.println(结果是: + strResult); catch (Exception e) System.out.println(输入错误);,控制台调用,类图,上述整个程序代码实现过程,就是一个设计的模式,简单工厂设计模式,反射,现在由另外一个程序员写了一个除法运算,并封装成了jar包,那么怎么来实现动态调用?,反射 JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制,谢 谢 !,Make Presentation much more fun,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号