工廠設(shè)計(jì)模式課件_第1頁(yè)
工廠設(shè)計(jì)模式課件_第2頁(yè)
工廠設(shè)計(jì)模式課件_第3頁(yè)
工廠設(shè)計(jì)模式課件_第4頁(yè)
工廠設(shè)計(jì)模式課件_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java設(shè)計(jì)模式工廠設(shè)計(jì)模式Java設(shè)計(jì)模式工廠設(shè)計(jì)模式理解并會(huì)使用EL理解并會(huì)使用常用的JSTL標(biāo)簽本章目標(biāo)理解并會(huì)使用EL本章目標(biāo)面試請(qǐng)用C++,Java,C#或VB.NET任意一種面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺(tái)程序,要求輸入兩個(gè)數(shù)和運(yùn)算符號(hào),得到結(jié)果?小菜今年計(jì)算機(jī)專(zhuān)業(yè)大四,一心想找份好工作,投了無(wú)數(shù)份簡(jiǎn)歷后,終于得到一個(gè)面試機(jī)會(huì)。小菜三下五除二寫(xiě)完了代碼仔細(xì)檢查后沒(méi)有發(fā)現(xiàn)錯(cuò)誤交卷后,單位通知他一周內(nèi)等消息面試請(qǐng)用C++,Java,C#或VB.NET小菜代碼Scannerin=newScanner(System.in);System.out.println("請(qǐng)輸入數(shù)字A:");StringA=in.next();System.out.println("請(qǐng)選擇運(yùn)算符號(hào)(+、=、*、/):");StringB=in.next();System.out.println("請(qǐng)輸入數(shù)字B:");StringC=in.next();StringD="";

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(Double.parseDouble(A)*Double.parseDouble(C));

if(B.equals("/"))D=String.valueOf(Double.parseDouble(A)/Double.parseDouble(C));System.out.println("結(jié)果是:"

+D);小菜代碼Scannerin=newScanner(Sys面試受挫一個(gè)月后仍然沒(méi)有消息,我的代碼實(shí)現(xiàn)了啊,怎么不給我機(jī)會(huì)?尋求幫助小菜找到從事軟件開(kāi)發(fā)工作7年的表哥大鳥(niǎo)請(qǐng)教大鳥(niǎo)問(wèn)了題目和了解小菜的代碼后哈哈大笑:”你上當(dāng)了,人家單位出題的意思,你完全沒(méi)有明白”面試受挫一個(gè)月后仍然沒(méi)有消息,我的代碼實(shí)現(xiàn)了啊,怎么不給我機(jī)初學(xué)者代碼毛病大鳥(niǎo)說(shuō):首先現(xiàn)在的代碼需要改進(jìn)的地方有很多。Scannerin=newScanner(System.in);System.out.println("請(qǐng)輸入數(shù)字A:");StringA=in.next();System.out.println("請(qǐng)選擇運(yùn)算符號(hào)(+、=、*、/):");StringB=in.next();System.out.println("請(qǐng)輸入數(shù)字B:");StringC=in.next();StringD="";

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(Double.parseDouble(A)*Double.parseDouble(C));

if(B.equals("/"))D=String.valueOf(Double.parseDouble(A)/Double.parseDouble(C));System.out.println("結(jié)果是:"

+D);命名不規(guī)范判斷分支,這樣寫(xiě)意味著程序做了三次無(wú)用功.除數(shù)為0或除數(shù)是字符串怎么辦?初學(xué)者代碼毛病大鳥(niǎo)說(shuō):首先現(xiàn)在的代碼需要改進(jìn)的地方有很多。S代碼規(guī)范Scannerin=newScanner(System.in);System.out.println("請(qǐng)輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請(qǐng)選擇運(yùn)算符號(hào)(+、=、*、/):");StringstrOperate=in.next();System.out.println("請(qǐng)輸入數(shù)字B:");StringstrNumberB=in.next();StringstrResult="";try{if(strOperate.equals("+")) strResult=String.valueOf(Double.parseDouble(strNumberA)+Double.parseDouble(strNumberB));elseif(strOperate.equals("-")) strResult=String.valueOf(Double.parseDouble(strNumberA)-Double.parseDouble(strNumberB));elseif(strOperate.equals("*")) strResult=String.valueOf(Double.parseDouble(strNumberA)*Double.parseDouble(strNumberB));elseif(strOperate.equals("/")){ Doubled=Double.parseDouble(strNumberB);if(d!=0){ strResult=String.valueOf(Double.parseDouble(strNumberA)/Double.parseDouble(strNumberB));}else{ strResult="除數(shù)為零!";}} System.out.println("結(jié)果是:"

+strResult);}catch(Exceptione){ System.out.println("輸入有誤");}代碼規(guī)范Scannerin=newScanner(S面向?qū)ο笮〔税凑沾篪B(niǎo)的建議改寫(xiě)了代碼?可是這樣寫(xiě)出的代碼是否符合出題人的意思呢?任意一種面向?qū)ο笳Z(yǔ)言。使用面向?qū)ο蟮木幊谭椒▽?shí)現(xiàn)請(qǐng)用C++,Java,C#或VB.NET任意一種面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺(tái)程序,要求輸入兩個(gè)數(shù)和運(yùn)算符號(hào),得到結(jié)果?面向?qū)ο笮〔税凑沾篪B(niǎo)的建議改寫(xiě)了代碼?可是這面向?qū)ο笏谐鯇W(xué)者都會(huì)有這樣的問(wèn)題。碰到問(wèn)題就直覺(jué)地用計(jì)算機(jī)能夠理解的邏輯來(lái)描述和表達(dá)待解決的問(wèn)題及具體的求解過(guò)程。用計(jì)算機(jī)的方式去思考比如計(jì)算器這個(gè)程序,先要求輸入兩個(gè)數(shù)和運(yùn)算符號(hào),然后根據(jù)運(yùn)算符號(hào)判斷選擇如何運(yùn)算,得到結(jié)果,這本身沒(méi)有錯(cuò),但這樣的思維卻使得我們的程序只為滿足實(shí)現(xiàn)當(dāng)前的需求。不容易維護(hù)不容易擴(kuò)展不容易復(fù)用如何才能容易維護(hù),容易擴(kuò)展,又容易復(fù)用呢?面向?qū)ο笏谐鯇W(xué)者都會(huì)有這樣的問(wèn)題。不容易維護(hù)如何才能容易維活字印刷面向?qū)ο蠛染瞥?,人生真爽,……這里面問(wèn)題出在哪呢?話說(shuō)三國(guó)時(shí)期,曹操帶領(lǐng)百萬(wàn)大軍攻打東吳…對(duì)酒當(dāng)歌,人生真爽,……對(duì)酒當(dāng)歌,人生幾何?……三國(guó)時(shí)期活字印刷還未發(fā)明活字印刷面向?qū)ο蠛染瞥瑁松嫠?,這里面問(wèn)題出在哪呢?話活字印刷面向?qū)ο蠛染瞥?,人生真爽,如果有了活字印刷,只需要?個(gè)字要改,只需更改要改的字—可維護(hù)對(duì)當(dāng)幾何字并非用完就無(wú)用,可以在以后印刷中重復(fù)使用—可復(fù)用此詩(shī)若要加字,只需另外刻字加入—可擴(kuò)展字的排列其實(shí)可能是豎排或橫排,只需移動(dòng)字的位置就可—靈活性好程序開(kāi)發(fā)有太多類(lèi)似曹操這樣的客戶,不斷的更改需求,客戶要求也不份,不就是改幾個(gè)字嗎?面對(duì)已完成的程序代碼,修改幾個(gè)字都有可能需要重頭再來(lái),實(shí)在痛苦。靈活利用面向?qū)ο笕筇匦?,?lái)完善程序活字印刷面向?qū)ο蠛染瞥瑁嫦驅(qū)ο笕绻F(xiàn)在我們?cè)賹?xiě)一個(gè)Windows的計(jì)算器,那么前面的代碼能否復(fù)用?復(fù)制代碼,初級(jí)程序員的工作就是Ctrl+C,Ctrl+V代碼越多時(shí),維護(hù)就麻煩盡量減少重復(fù)前面代碼有多少和控制臺(tái)無(wú)關(guān),而只是和計(jì)算器有關(guān)?面向?qū)ο笕绻F(xiàn)在我們?cè)賹?xiě)一個(gè)Windows的業(yè)務(wù)封裝業(yè)務(wù)邏輯與界面邏輯分開(kāi),只有分離才可以達(dá)到容易維護(hù)或擴(kuò)展。單獨(dú)分離出一個(gè)類(lèi):Operation運(yùn)算類(lèi)Operation類(lèi)主要用于計(jì)算,與界面等無(wú)關(guān)不單控制臺(tái)程序能用,Swing能用,Web程序同意能用三個(gè)參數(shù),兩個(gè)為輸入數(shù),一個(gè)為操作符業(yè)務(wù)封裝業(yè)務(wù)邏輯與界面邏輯分開(kāi),只有分離才可以達(dá)到容易維護(hù)或業(yè)務(wù)封裝publicclassOperation{publicstaticdoubleGetResult(StringstrNumberA,StringstrNumberB,StringstrOperate){doublestrResult=0d;try{if(strOperate.equals("+"))strResult=(Double.parseDouble(strNumberA)+Double.parseDouble(strNumberB));elseif(strOperate.equals("-"))strResult=(Double.parseDouble(strNumberA)-Double.parseDouble(strNumberB));elseif(strOperate.equals("*"))strResult=(Double.parseDouble(strNumberA)*Double.parseDouble(strNumberB));elseif(strOperate.equals("/")){Doubled=Double.parseDouble(strNumberB);if(d!=0){strResult=(Double.parseDouble(strNumberA)/Double.parseDouble(strNumberB));}else{strResult=0;}}}catch(Exceptione){strResult=0;}returnstrResult;}}Scannerin=newScanner(System.in);System.out.println("請(qǐng)輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請(qǐng)選擇運(yùn)算符號(hào)(+、=、*、/):");StringstrOperate=in.next();System.out.println("請(qǐng)輸入數(shù)字B:");StringstrNumberB=in.next();DoublestrResult=Operation.GetResult(strNumberA,strNumberB,strOperate);System.out.println("結(jié)果是:"

+strResult);Operation控制臺(tái)現(xiàn)在是完全面向?qū)ο髥??只用了面向?qū)ο笕筇匦灾械囊粋€(gè):封裝繼承?多態(tài)?

如果我希望增加一個(gè)求最大值(Max)的運(yùn)算,如何修改?

elseif(strOperate.equals("max")){strResult=Math.max(Double.parseDouble(strNumberA),Double.parseDouble(strNumberB));}

弊端與問(wèn)題:1.整個(gè)運(yùn)算類(lèi)都要參與編譯2.萬(wàn)一其它運(yùn)算被你修改,而沒(méi)有發(fā)現(xiàn)問(wèn)題?3.不同程序員同時(shí)在增加新的運(yùn)算算法,怎么辦?業(yè)務(wù)封裝Scannerin=newScanner(S繼承利用繼承,重新編寫(xiě)Operation類(lèi),Operation類(lèi)為基類(lèi),充當(dāng)接口的角色擁有兩個(gè)屬性,分別保存操作數(shù)和被操作數(shù)NumberANumberB擁有一個(gè)方法,此方法為虛方法,能被重寫(xiě)(因?yàn)椴煌\(yùn)算會(huì)有不同的算法返回不同的值),返回運(yùn)算值。virtualdoubleGetResult()繼承利用繼承,重新編寫(xiě)Operation類(lèi),Operati繼承publicclassOperation{protecteddoublenumberA=0;protecteddoublenumberB=0;publicdoublegetNumberA(){ returnnumberA;}publicvoidsetNumberA(doublenumberA){ this.numberA=numberA;}publicdoublegetNumberB(){ returnnumberB;}publicvoidsetNumberB(doublenumberB){ this.numberB=numberB;}publicdoubleGetResult(){ doubleresult=0; returnresult;}}Operation

類(lèi)基類(lèi)//加法類(lèi),繼承運(yùn)算類(lèi)classOperationAddextendsOperation{publicdoubleGetResult(){doubleresult=0;result=NumberA+NumberB;returnresult;}}//減法類(lèi),繼承運(yùn)算類(lèi)classOperationSubextendsOperation{publicdoubleGetResult(){doubleresult=0;result=NumberA-NumberB;returnresult;}}其它的運(yùn)算算法類(lèi)…..如何讓程序知道哪個(gè)算法?怎么調(diào)用寫(xiě)的算法類(lèi)?繼承publicclassOperation{Oper多態(tài)利用多態(tài),來(lái)實(shí)現(xiàn)到底要實(shí)例化誰(shuí),單獨(dú)用一個(gè)類(lèi)來(lái)實(shí)現(xiàn)創(chuàng)造實(shí)例的過(guò)程,這就是工廠。OperationFactory充當(dāng)實(shí)例化的工廠,通過(guò)這個(gè)類(lèi)利用多態(tài)來(lái)實(shí)例化運(yùn)算算法類(lèi)這個(gè)工廠比較簡(jiǎn)單,返回統(tǒng)一的父類(lèi)即Operation類(lèi)。publicclassOperationFactory{

publicstaticOperationcreateOperate(Stringoperate)

{Operationoper=null;

if(operate.equals("+")){oper=newOperationAdd();}elseif(operate.equals("-")){oper=newOperationSub();

}

returnoper;

}}Scannerin=newScanner(System.in);System.out.println("請(qǐng)輸入數(shù)字A:");StringstrNumberA=in.next();System.out.println("請(qǐng)選擇運(yùn)算符號(hào)(+、=、*、/):");StringstrOperate=in.next();System.ou

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論