淺析java常用的設(shè)計(jì)模式_第1頁
淺析java常用的設(shè)計(jì)模式_第2頁
淺析java常用的設(shè)計(jì)模式_第3頁
淺析java常用的設(shè)計(jì)模式_第4頁
淺析java常用的設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1、工廠廠模式:客戶類類和工廠廠類分開開。消費(fèi)費(fèi)者任何何時(shí)候需需要某種種產(chǎn)品,只需向向工廠請請求即可可。消費(fèi)費(fèi)者無須須修改就就可以接接納新產(chǎn)產(chǎn)品。缺缺點(diǎn)是當(dāng)當(dāng)產(chǎn)品修修改時(shí),工廠類類也要做做相應(yīng)的的修改。如:如何創(chuàng)創(chuàng)建及如如何向客客戶端提提供。 2、建建造模式式:將產(chǎn)產(chǎn)品的內(nèi)內(nèi)部表象象和產(chǎn)品品的生成成過程分分割開來來,從而而使一個(gè)個(gè)建造過過程生成成具有不不同的內(nèi)內(nèi)部表象象的產(chǎn)品品對象。建造模模式使得得產(chǎn)品內(nèi)內(nèi)部表象象可以獨(dú)獨(dú)立的變變化,客客戶不必必知道產(chǎn)產(chǎn)品內(nèi)部部組成的的細(xì)節(jié)。建造模模式可以以強(qiáng)制實(shí)實(shí)行一種種分步驟驟進(jìn)行的的建造過過程。 3、工工廠方法法模式:核心工工廠類不不再負(fù)責(zé)責(zé)所有產(chǎn)產(chǎn)品的

2、創(chuàng)創(chuàng)建,而而是將具具體創(chuàng)建建的工作作交給子子類去做做,成為為一個(gè)抽抽象工廠廠角色,僅負(fù)責(zé)責(zé)給出具具體工廠廠類必須須實(shí)現(xiàn)的的接口,而不接接觸哪一一個(gè)產(chǎn)品品類應(yīng)當(dāng)當(dāng)被實(shí)例例化這種種細(xì)節(jié)。 4、原始模模型模式式:通過過給出一一個(gè)原型對對象來指指明所要要?jiǎng)?chuàng)建的的對象的的類型,然后用用復(fù)制這這個(gè)原型型對象的的方法創(chuàng)創(chuàng)建出更更多同類類型的對對象。原原始模型型模式允允許動(dòng)態(tài)態(tài)的增加加或減少少產(chǎn)品類類,產(chǎn)品品類不需需要非得得有任何何事先確確定的等等級(jí)結(jié)構(gòu)構(gòu),原始始模型模模式適用用于任何何的等級(jí)級(jí)結(jié)構(gòu)。缺點(diǎn)是是每一個(gè)個(gè)類都必必須配備備一個(gè)克克隆方法法。 55、單例例模式:單例模模式確保保某一個(gè)個(gè)類只有有一個(gè)實(shí)實(shí)

3、例,而而且自行行實(shí)例化化并向整整個(gè)系統(tǒng)統(tǒng)提供這這個(gè)實(shí)例例單例模模式。單單例模式式只應(yīng)在在有真正正的“單單一實(shí)例例”的需需求時(shí)才才可使用用。 6、適配器器(變壓壓器)模模式:把把一個(gè)類類的接口口變換成成客戶端端所期待待的另一一種接口口,從而而使原本本因接口口原因不不匹配而無法一一起工作作的兩個(gè)個(gè)類能夠夠一起工工作。適適配類可可以根據(jù)據(jù)參數(shù)返返還一個(gè)個(gè)合適的的實(shí)例給給客戶端端。 77、橋梁梁模式:將抽象象化與實(shí)實(shí)現(xiàn)化脫脫耦,使使得二者者可以獨(dú)獨(dú)立的變變化,也也就是說說將他們們之間的的強(qiáng)關(guān)聯(lián)聯(lián)變成弱弱關(guān)聯(lián),也就是是指在一一個(gè)軟件件系統(tǒng)的的抽象化化和實(shí)現(xiàn)現(xiàn)化之間間使用組組合/聚聚合關(guān)系系而不是是繼承關(guān)

4、關(guān)系,從從而使兩兩者可以以獨(dú)立的的變化。 8、合成模模式:合合成模式式將對象象組織到到樹結(jié)構(gòu)構(gòu)中,可可以用來來描述整整體與部部分的關(guān)關(guān)系。合合成模式式就是一一個(gè)處理理對象的的樹結(jié)構(gòu)構(gòu)的模式式。合成成模式把把部分與與整體的的關(guān)系用用樹結(jié)構(gòu)構(gòu)表示出出來。合合成模式式使得客客戶端把把一個(gè)個(gè)個(gè)單獨(dú)的的成分對對象和由由他們復(fù)合而成成的合成成對象同同等看待待。 99、裝飾飾模式:裝飾模模式以對對客戶端端透明的的方式擴(kuò)擴(kuò)展對象象的功能能,是繼繼承關(guān)系系的一個(gè)個(gè)替代方方案,提提供比繼繼承更多多的靈活活性。動(dòng)動(dòng)態(tài)給一一個(gè)對象象增加功功能,這這些功能能可以再再動(dòng)態(tài)的的撤消。增加由由一些基基本功能能的排列列組合而而

5、產(chǎn)生的的非常大大量的功功能。 10、門面模模式:外外部與一一個(gè)子系系統(tǒng)的通通信必須須通過一一個(gè)統(tǒng)一一的門面面對象進(jìn)進(jìn)行。門門面模式式提供一一個(gè)高層層次的接接口,使使得子系系統(tǒng)更易易于使用用。每一一個(gè)子系系統(tǒng)只有有一個(gè)門門面類,而且此此門面類類只有一一個(gè)實(shí)例例,也就就是說它它是一個(gè)個(gè)單例模模式。但但整個(gè)系系統(tǒng)可以以有多個(gè)個(gè)門面類類。 111、享享元模式:FLYYWEIIGHTT在拳擊擊比賽中中指最輕輕量級(jí)。享元模模式以共共享的方方式高效效的支持持大量的的細(xì)粒度度對象。享元模模式能做做到共享享的關(guān)鍵鍵是區(qū)分分內(nèi)蘊(yùn)狀狀態(tài)和外外蘊(yùn)狀態(tài)態(tài)。內(nèi)蘊(yùn)蘊(yùn)狀態(tài)存存儲(chǔ)在享享元內(nèi)部部,不會(huì)會(huì)隨環(huán)境境的改變變而有所所不

6、同。外蘊(yùn)狀狀態(tài)是隨隨環(huán)境的的改變而而改變的的。外蘊(yùn)蘊(yùn)狀態(tài)不不能影響響內(nèi)蘊(yùn)狀狀態(tài),它它們是相相互獨(dú)立立的。將將可以共共享的狀狀態(tài)和不不可以共共享的狀狀態(tài)從常常規(guī)類中中區(qū)分開開來,將將不可以以共享的的狀態(tài)從從類里剔剔除出去去??蛻魬舳瞬豢煽梢灾苯咏觿?chuàng)建被被共享的的對象,而應(yīng)當(dāng)當(dāng)使用一一個(gè)工廠廠對象負(fù)負(fù)責(zé)創(chuàng)建建被共享享的對象象。享元元模式大大幅度的的降低內(nèi)內(nèi)存中對對象的數(shù)數(shù)量。 12、代理模模式:代代理模式給某某一個(gè)對對象提供供一個(gè)代代理對象象,并由由代理對對象控制制對源對對象的引引用。代代理就是是一個(gè)人人或一個(gè)個(gè)機(jī)構(gòu)代代表另一一個(gè)人或或者一個(gè)個(gè)機(jī)構(gòu)采采取行動(dòng)動(dòng)。某些些情況下下,客戶戶不想或或者不能

7、能夠直接接引用一一個(gè)對象象,代理理對象可可以在客客戶和目目標(biāo)對象象直接起起到中介介的作用用??蛻魬舳朔直姹娌怀龃碇黝}題對象與與真實(shí)主主題對象象。代理理模式可可以并不不知道真真正的被被代理對對象,而而僅僅持持有一個(gè)個(gè)被代理理對象的的接口,這時(shí)候候代理對對象不能能夠創(chuàng)建建被代理理對象,被代理理對象必必須有系系統(tǒng)的其其他角色色代為創(chuàng)創(chuàng)建并傳傳入。 113、責(zé)責(zé)任鏈模模式:在在責(zé)任鏈鏈模式中中,很多多對象由由每一個(gè)個(gè)對象對對其下家家的引用用而接 起起來形成成一條鏈。請請求在這這個(gè)鏈上上傳遞,直到鏈鏈上的某某一個(gè)對對象決定定處理此此請求??蛻舨⒉⒉恢赖梨溕系牡哪囊粋€(gè)個(gè)對象最最終處理理這個(gè)請請求,系

8、系統(tǒng)可以以在不影影響客戶戶端的情情況下動(dòng)動(dòng)態(tài)的重重新組織織鏈和分分配責(zé)任任。處理理者有兩兩個(gè)選擇擇:承擔(dān)擔(dān)責(zé)任或或者把責(zé)責(zé)任推給給下家。一個(gè)請請求可以以最終不不被任何何接收端端對象所所接受。 144、命令令模式:命令模模式把一一個(gè)請求求或者操操作封裝裝到一個(gè)個(gè)對象中中。命令令模式把把發(fā)出命命令的責(zé)責(zé)任和執(zhí)執(zhí)行命令令的責(zé)任任分割開開,委派派給不同同的對象象。命令令模式允允許請求求的一方方和發(fā)送送的一方方獨(dú)立開開來,使使得請求求的一方方不必知知道接收收請求的的一方的的接口,更不必必知道請請求是怎怎么被接接收,以以及操作是否否執(zhí)行,何時(shí)被被執(zhí)行以以及是怎怎么被執(zhí)執(zhí)行的。系統(tǒng)支支持命令令的撤消消。 1

9、15、解解釋器模模式:給給定一個(gè)個(gè)語言后后,解釋釋器模式式可以定定義出其其文法的的一種表表示,并并同時(shí)提提供一個(gè)個(gè)解釋器器??蛻魬舳丝梢砸允褂眠@這個(gè)解釋釋器來解解釋這個(gè)個(gè)語言中中的句子子。解釋釋器模式式將描述述怎樣在在有了一一個(gè)簡單單的文法法后,使使用模式式設(shè)計(jì)解解釋這些些語句。在解釋釋器模式式里面提提到的語語言是指指任何解解釋器對對象能夠夠解釋的的任何組組合。在在解釋器器模式中中需要定定義一個(gè)個(gè)代表文文法的命命令類的的等級(jí)結(jié)結(jié)構(gòu),也也就是一一系列的的組合規(guī)規(guī)則。每每一個(gè)命命令對象象都有一一個(gè)解釋釋方法,代表對對命令對對象的解解釋。命命令對象象的等級(jí)級(jí)結(jié)構(gòu)中中的對象象的任何排列列組合都都是一個(gè)

10、個(gè)語言。 166、迭代代子模式式:迭代代子模式式可以順順序訪問問一個(gè)聚聚集中的的元素而而不必暴暴露聚集集的內(nèi)部部表象。多個(gè)對對象聚在在一起形形成的總總體稱之之為聚集集,聚集集對象是是能夠包包容一組組對象的的容器對對象。迭迭代子模模式將迭迭代邏輯輯封裝到到一個(gè)獨(dú)獨(dú)立的子子對象中中,從而而與聚集集本身隔隔開。迭迭代子模模式簡化化了聚集集的界面面。每一一個(gè)聚集集對象都都可以有有一個(gè)或或一個(gè)以以上的迭迭代子對對象,每每一個(gè)迭迭代子的的迭代狀狀態(tài)可以以是彼此此獨(dú)立的的。迭代代算法可可以獨(dú)立立于聚集集角色變變化。 17、調(diào)停者者模式:調(diào)停者者模式包包裝了一一系列對對象相互互作用的的方式,使得這這些對象象不

11、必相相互明顯顯作用。從而使使他們可可以松散散偶合。當(dāng)某些些對象之之間的作作用發(fā)生生改變時(shí)時(shí),不會(huì)會(huì)立即影影響其他他的一些些對象之之間的作作用。保保證這些些作用可可以彼此此獨(dú)立的的變化。調(diào)停者者模式將將多對多多的相互互作用轉(zhuǎn)轉(zhuǎn)化為一一對多的的相互作作用。調(diào)調(diào)停者模模式將對對象的行行為和協(xié)協(xié)作抽象象化,把把對象在在小尺度度的行為為上與其其他對象象的相互互作用分分開處理理。 118、備備忘錄模模式:備備忘錄對對象是一一個(gè)用來來存儲(chǔ)另另外一個(gè)個(gè)對象內(nèi)內(nèi)部狀態(tài)態(tài)的快照照的對象象。備忘忘錄模式式的用意意是在不不破壞封封裝的條條件下,將一個(gè)個(gè)對象的的狀態(tài)捉捉住,并并外部化化,存儲(chǔ)儲(chǔ)起來,從而可可以在將將來合

12、適適的時(shí)候候把這個(gè)個(gè)對象還還原到存存儲(chǔ)起來來的狀態(tài)態(tài)。 119、觀察者模模式:觀觀察者模模式定義義了一種種一隊(duì)多多的依賴賴關(guān)系,讓多個(gè)個(gè)觀察者者對象同同時(shí)監(jiān)聽聽某一個(gè)個(gè)主題對對象。這這個(gè)主題題對象在在狀態(tài)上上發(fā)生變變化時(shí),會(huì)通知知所有觀觀察者對對象,使使他們能能夠自動(dòng)動(dòng)更新自自己。 20、狀態(tài)模模式:狀狀態(tài)模式式允許一一個(gè)對象象在其內(nèi)內(nèi)部狀態(tài)態(tài)改變的的時(shí)候改改變行為為。這個(gè)個(gè)對象看看上去象象是改變變了它的的類一樣樣。狀態(tài)態(tài)模式把把所研究究的對象象的行為為包裝在在不同的的狀態(tài)對對象里,每一個(gè)個(gè)狀態(tài)對對象都屬屬于一個(gè)個(gè)抽象狀狀態(tài)類的的一個(gè)子子類。狀狀態(tài)模式式的意圖圖是讓一一個(gè)對象象在其內(nèi)內(nèi)部狀態(tài)態(tài)

13、改變的的時(shí)候,其行為為也隨之之改變。狀態(tài)模模式需要要對每一一個(gè)系統(tǒng)統(tǒng)可能取取得的狀狀態(tài)創(chuàng)立立一個(gè)狀狀態(tài)類的的子類。當(dāng)系統(tǒng)的狀狀態(tài)變化化時(shí),系系統(tǒng)便改改變所選選的子類類。 221、策策略模式式:策略略模式針針對一組組算法,將每一一個(gè)算法法封裝到到具有共共同接口口的獨(dú)立立的類中中,從而而使得它它們可以以相互替替換。策策略模式式使得算算法可以以在不影影響到客客戶端的的情況下下發(fā)生變變化。策策略模式式把行為為和環(huán)境境分開。環(huán)境類類負(fù)責(zé)維維持和查查詢行為為類,各各種算法法在具體體的策略略類中提提供。由由于算法法和環(huán)境境獨(dú)立開開來,算算法的增增減,修修改都不不會(huì)影響響到環(huán)境境和客戶戶端。 22、模板方方法

14、模式式:模板板方法模模式準(zhǔn)備備一個(gè)抽抽象類,將部分分邏輯以以具體方方法以及及具體構(gòu)構(gòu)造子的的形式實(shí)實(shí)現(xiàn),然然后聲明明一些抽抽象方法法來迫使使子類實(shí)實(shí)現(xiàn)剩余余的邏輯。不同同的子類類可以以以不同的的方式實(shí)實(shí)現(xiàn)這些些抽象方方法,從從而對剩剩余的邏邏輯有不不同的實(shí)實(shí)現(xiàn)。先先制定一一個(gè)頂級(jí)級(jí)邏輯框框架,而而將邏輯輯的細(xì)節(jié)節(jié)留給具具體的子子類去實(shí)實(shí)現(xiàn)。 23、訪問者者模式:訪問者者模式的的目的是是封裝一一些施加加于某種種數(shù)據(jù)結(jié)結(jié)構(gòu)元素素之上的的操作。一旦這這些操作作需要修修改的話話,接受受這個(gè)操操作的數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)可以保保持不變變。訪問問者模式式適用于于數(shù)據(jù)結(jié)結(jié)構(gòu)相對對未定的的系統(tǒng),它把數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)和作用用

15、于結(jié)構(gòu)構(gòu)上的操操作之間間的耦合合解脫開開,使得得操作集集合可以以相對自自由的演演化。訪訪問者模模式使得得增加新新的操作作變的很很容易,就是增增加一個(gè)個(gè)新的訪訪問者類類。訪問問者模式式將有關(guān)關(guān)的行為為集中到到一個(gè)訪訪問者對象中中,而不不是分散散到一個(gè)個(gè)個(gè)的節(jié)節(jié)點(diǎn)類中中。當(dāng)使使用訪問問者模式式時(shí),要要將盡可可能多的的對象瀏瀏覽邏輯輯放在訪訪問者類類中,而而不是放放到它的的子類中中。訪問問者模式式可以跨跨過幾個(gè)個(gè)類的等等級(jí)結(jié)構(gòu)構(gòu)訪問屬屬于不同同的等級(jí)級(jí)結(jié)構(gòu)的的成員類類。工廠模式式的幾種種形態(tài):1、簡單單工廠模模式,又又叫做靜靜態(tài)工廠廠方法(Staaticc Faactoory Metthodd)模式

16、式。 2、工廠廠方法模模式,又又稱為多多態(tài)性工工廠(PPolyymorrphiic FFacttoryy)模式式 3、抽象象工廠模模式,又又稱工具具(Kiit或TToollKitt)模式式 簡單工廠廠模式(Simmplee Faactoory) 1、模式式: 簡單工廠廠模式是是類的創(chuàng)創(chuàng)建模式式,又叫叫做靜態(tài)態(tài)工廠方方法(SStattic Facctorry MMethhod)模式。 它是由一一個(gè)工廠廠對象決決定創(chuàng)建建出哪一一種產(chǎn)品品類的實(shí)實(shí)例。 Javaa代碼 1.2、舉例: 2. /水水果接口口 3. pubblicc innterrfacce FFruiit 4. vooid groow(

17、); /生生長 5. vooid harrvesst(); /收獲獲 6. voiid pplannt(); /種植植 7. 8. 9. /蘋蘋果類 10. puubliic cclasss AApplle iimpllemeentss Frruitt 11. pprivvatee innt ttreeeAgee /樹齡 12. 13. ppubllic voiid ggroww() 14. llog(Appplee iss grrowiing.); 15. 16. 17. ppubllic voiid hharvvestt() 18. logg(AApplle hhas beeen hhar

18、vventted.); 19. 20. 21. ppubllic voiid pplannt() 22. llog(Appplee haas bbeenn pllantted.); 23. 24. 25. /輔助助方法 26. ppubllic staaticc vooid logg(Sttrinng mmsg) 27. Sysstemm.ouut.pprinntlnn(mssg); 28. 29. 30. ppubllic intt geetTrreeAAge() 31. retturnn trreeAAge; 32. 33. 34. ppubllic voiid ssetTTreeeAge

19、e(innt ttreeeAgee) 35. thiis.ttreeeAgee = treeeAgge; 36. 37. 38. 39. /葡萄類類 40. puubliic cclasss GGrappe iimpllemeentss Frruitt 41. pprivvatee boooleean seeedleess; 42. 43. ppubllic voiid ggroww() 44. logg(GGrappe iis ggrowwingg.); 45. 46. 47. ppubllic voiid hharvvestt() 48. logg(GGrappe hhas beeen h

20、harvvestted.);49. 50. 51. ppubllic voiid pplannt() 52. logg(GGrappe hhas beeen pplanntedd.); 53. 54. 55. ppubllic staaticc vooid logg(Sttrinng mmsg) 56. Sysstemm.ouut.pprinntlnn(mssg); 57. 58. 59. /有無無籽方法法 60. ppubllic boooleaan ggetSSeeddlesss() 61. retturnn seeedllesss; 62. 63. 64. ppubllic voiid

21、ssetSSeeddleees(bboolleann seeedllesss) 65. thiis.sseeddlesss = seeedllesss; 66. 67. 68. 69. /草莓類類 70. puubliic cclasss SStraawbeerryy immpleemennts Fruuit 71. ppubllic voiid ggroww() 72. logg(SStraawbeerryy iss grrowiing.); 73. 74. 75. ppubllic voiid hharvvestt() 76. logg(SStraawbeerryy haas bbeenn

22、 haarveesteed.); 77. 78. 79. ppubllic voiid pplannt() 80. logg(SStraawbeerryy haas bbeenn pllantted.); 81. 82. 83. ppubllic staaticc vooid logg(Sttrinng mmsg) 84. Sysstemm.ouut.pprinntlnn(mssg); 85. 86. 87. 88. /農(nóng)場園園丁類,由他決決定創(chuàng)建建哪種水水果類的的實(shí)例 89. puubliic cclasss FFruiitGaardeenerr 90. /靜態(tài)態(tài)工廠方方法 91. ppub

23、llic staaticc Frruitt faactoory(Strringg whhichh) tthroows BaddFruuitEExceeptiion 92. if(whiich.equualsslgnnoreeCasse(appple) 93. reeturrn nnew Appple(); 94. ellse if(whiich.equualsslgnnoreeCasse(graape) 95. reeturrn nnew Graape(); 96. ellse if(whiich.equualsslgnnoreeCasse(strrawbberrry) 97. reeturr

24、n nnew Strrawbberrry(); 98. ellse 99. thhroww neew BBadFFruiitExxcepptioon(Badd frruitt reequeest); 100. 101. 102. 103. 104. /異常常類 105. ppubllic claass BaddFruuitEExceeptiion exttendds EExceeptiion 106. pubblicc BaadFrruittExccepttionn(Sttrinng mmsg) 107. suuperr(mssg); 108. 109. 110. 111. /測試試類 112

25、. ppubllic claass Tesst 113. FruuitGGarddeneer ggarddeneer =neww FrruittGarrdenner(); 114. tryy 115. gaardeenerr.faactoory(grrapee); 116. gaardeenerr.faactoory(appplee); 117. gaardeenerr.faactoory(sttrawwberrry); 118. gaardeenerr.faactoory(baananna); /拋出出異常 119. caatchh(BaadFrruittExccepttionn e) 12

26、0. Syysteem.oout.priintlln(donnttt haas tthiss frruitt.); 121. 122. 123. 2、舉例例:/水果接接口puubliic iinteerfaace Fruuitvvoidd grrow();/生生長vvoidd haarveest();/收收獲vvoidd pllantt();/種種植/蘋果類類puubliic cclasss AApplle iimpllemeentss Frruittpprivvatee innt ttreeeAgee/樹樹齡ppubllic voiid ggroww()logg(AApplle iis gg

27、rowwingg.);ppubllic voiid hharvvestt()logg(AApplle hhas beeen hharvventted.);ppubllic voiid pplannt()logg(AApplle hhas beeen pplanntedd.);/輔助助方法ppubllic staaticc vooid logg(Sttrinng mmsg)Sysstemm.ouut.pprinntlnn(mssg);ppubllic intt geetTrreeAAge()retturnn trreeAAge;ppubllic voiid ssetTTreeeAgee(innt

28、 ttreeeAgee)thiis.ttreeeAgee = treeeAgge;/葡萄類類puubliic cclasss GGrappe iimpllemeentss Frruittpprivvatee boooleean seeedleess;ppubllic voiid ggroww()logg(GGrappe iis ggrowwingg.);ppubllic voiid hharvvestt()logg(GGrappe hhas beeen hharvvestted.);ppubllic voiid pplannt()llog(Grrapee haas bbeenn pllantt

29、ed.);ppubllic staaticc vooid logg(Sttrinng mmsg)Sysstemm.ouut.pprinntlnn(mssg);/有無無籽方法法ppubllic boooleaan ggetSSeeddlesss()retturnn seeedllesss;ppubllic voiid ssetSSeeddleees(bboolleann seeedllesss)thiis.sseeddlesss = seeedllesss;/草莓類類puubliic cclasss SStraawbeerryy immpleemennts Fruuitppubllic voii

30、d ggroww()logg(SStraawbeerryy iss grrowiing.);ppubllic voiid hharvvestt()logg(SStraawbeerryy haas bbeenn haarveesteed.);ppubllic voiid pplannt()log(Sttrawwberrry hass beeen plaanteed.);ppubllic staaticc vooid logg(Sttrinng mmsg)Sysstemm.ouut.pprinntlnn(mssg);/農(nóng)場園園丁類,由他決決定創(chuàng)建建哪種水水果類的的實(shí)例puubliic cclass

31、s FFruiitGaardeenerr/靜態(tài)態(tài)工廠方方法ppubllic staaticc Frruitt faactoory(Strringg whhichh) tthroows BaddFruuitEExceeptiionif(whiich.equualsslgnnoreeCasse(appple)retturnn neew AApplle();ellse if(whiich.equualsslgnnoreeCasse(graape)retturnn neew GGrappe();ellse if(whiich.equualsslgnnoreeCasse(strrawbberrry)re

32、tturnn neew SStraawbeerryy();ellsethrrow neww BaadFrruittExccepttionn(BBad fruuit reqquesst);/異常類類puubliic cclasss BBadFFruiitExxcepptioon eexteendss Exxcepptioonppubllic BaddFruuitEExceeptiion(Strringg mssg)supper(msgg);/測試類類puubliic cclasss TTesttFFruiitGaardeenerr gaardeenerr =nnew FruuitGGardden

33、eer();ttrygarrdenner.facctorry(graape);garrdenner.facctorry(appple);garrdenner.facctorry(strrawbberrry);garrdenner.facctorry(bannanaa);/拋拋出異常常cattch(BaddFruuitEExceeptiion e)Syysteem.oout.priintlln(donnttt haas tthiss frruitt.);3、三個(gè)個(gè)角色: 1、工廠廠類(CCreaatorr)角色色:在客客戶端的的直接調(diào)調(diào)用下創(chuàng)創(chuàng)建產(chǎn)品品對象 2、抽象象產(chǎn)品角角色:可可以用一一個(gè)接

34、口口或者一一個(gè)抽象象類實(shí)現(xiàn)現(xiàn) 3、具體體產(chǎn)品角角色:工工廠方法法模式所所創(chuàng)建的的任何對對象都是是這個(gè)角角色的實(shí)實(shí)例 4、如果果工廠方方法總是是循環(huán)使使用同一一個(gè)產(chǎn)品品對象,那么這這個(gè)工廠廠對象可可以使用用一個(gè)屬屬性來存存儲(chǔ)這個(gè)個(gè)產(chǎn)品對對象。 每每一次客客戶端調(diào)調(diào)用工廠廠方法時(shí)時(shí),工廠廠方法總總是提供供這同一一個(gè)對象象。 如如果工廠廠方法永永遠(yuǎn)循環(huán)環(huán)使用固固定數(shù)目目的一些些產(chǎn)品對對象,而而且這些些產(chǎn)品對對象的數(shù)數(shù)目并不不大的話話, 可可以使用用一些私私有屬性性存儲(chǔ)對對這些產(chǎn)產(chǎn)品對象象的引用用。比如如:一個(gè)個(gè)永遠(yuǎn)只只提供一一個(gè)產(chǎn)品品對象的的工廠對對象 可可以使用用一個(gè)靜靜態(tài)變量量存儲(chǔ)對對這個(gè)產(chǎn)產(chǎn)品

35、對象象的引用用。 如如果工廠廠方法使使用數(shù)目目不確定定,或者者數(shù)目較較大的一一些產(chǎn)品品對象的的話,使使用屬性性變量存存儲(chǔ)對這這些產(chǎn)品品對象的的引用就就不方便便了, 這這時(shí)候 就應(yīng)當(dāng)當(dāng)使用聚聚集對象象存儲(chǔ)對對產(chǎn)品對對象的引引用。 5、其他模模式; 1、單例模模式:單單例模式式要求單單例類的的構(gòu)造子子是私有有的,從從而客戶戶端不能能直接將將之實(shí)例例化,而而必須通通過這個(gè)個(gè)靜態(tài)工工廠方法法將之實(shí)實(shí)例化, 而且單單例類自自身是自自己的工工廠角色色。單例例類自己己負(fù)責(zé)創(chuàng)創(chuàng)建自身身的實(shí)例例 單例類類使用一一個(gè)靜態(tài)態(tài)屬性存存儲(chǔ)自己己的唯一一的實(shí)例例,工廠廠方法永永遠(yuǎn)僅提提供這一一個(gè)實(shí)例例 2、多例模模式:它

36、它是對單單例模式式的推廣廣,多例例模式也也禁止外外界直接接將之實(shí)實(shí)例化,同時(shí)通通過靜態(tài)態(tài)工廠方方法想外外界提供供循環(huán)使使用的自自身的實(shí)實(shí)例, 多例模模式可以以有多個(gè)個(gè)實(shí)例 多例模模式具有有一個(gè)聚聚集屬性性,通過過向這個(gè)個(gè)聚集屬屬性登記記已經(jīng)創(chuàng)創(chuàng)建過的的實(shí)例達(dá)達(dá)到循環(huán)環(huán)使用實(shí)實(shí)例的目目的, 它還擁擁有一個(gè)個(gè)內(nèi)部狀狀態(tài),每每一個(gè)內(nèi)內(nèi)部狀態(tài)態(tài)都只有有一個(gè)實(shí)實(shí)例存在在 根據(jù)外外界傳入入的參量量,工廠廠方法可可以查詢詢自己的的登記聚聚集,如如果具有有這個(gè)狀狀態(tài)的實(shí)實(shí)例已經(jīng)經(jīng)存在, 就直接接將這個(gè)個(gè)實(shí)例提提供給外外界:反反之,就就首先創(chuàng)創(chuàng)建一個(gè)個(gè)新的滿滿足要求求的實(shí)例例,將之之登記到到聚集中中,然后后再提

37、供供客戶端端。 3、備忘錄錄模式:單例模模式和多多例模式式使用一一個(gè)屬性性或者聚聚集屬性性來登記記所創(chuàng)建建的產(chǎn)品品對象,一邊可可以通過過查詢這這個(gè)屬性性或者聚聚集屬性性 找找到并共共享已經(jīng)經(jīng)創(chuàng)建了了的產(chǎn)品品對象,這就是是備忘錄錄模式的的應(yīng)用。 4、MVCC模式:是更高高層次上上的架構(gòu)構(gòu)模式。 包括:合成模模式、策策略模式式、觀察察者模式式、也有有可能會(huì)會(huì)包括裝裝飾模式式、調(diào)停停者模式式、迭代代子模式式以及工工廠方法法模式等等。 :如果系系統(tǒng)需要要有多個(gè)個(gè)控制器器參與這這個(gè)過程程的話,簡單工工廠模式式就不適適合了,應(yīng)當(dāng)考考慮使用用工廠方方法模式式。 6、簡單工工廠模式式的優(yōu)點(diǎn)點(diǎn)己缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)點(diǎn):

38、模式式的核心心是工廠廠類,這這個(gè)類有有必要的的判斷邏邏輯,可可以決定定在什么么時(shí)候創(chuàng)創(chuàng)建哪一一個(gè)產(chǎn)品品類的實(shí)實(shí)例。 而客客戶端則則可以免免除直接接創(chuàng)建產(chǎn)產(chǎn)品對象象的責(zé)任任,而僅僅僅負(fù)責(zé)責(zé)“消費(fèi)”產(chǎn)品。簡單工工廠模式式通過這這種做法法實(shí)現(xiàn)了了對責(zé)任任的分割割 缺點(diǎn)點(diǎn):1)這個(gè)工工廠類集集中了所所有的產(chǎn)產(chǎn)品創(chuàng)建建邏輯,形成一一個(gè)無所所不知的的全能類類,有人人把這種種類叫做做上帝類類(Good CClasss)。 如果這這個(gè)全能能類代表表的是農(nóng)農(nóng)場的一一個(gè)具體體園丁的的話,那那么這個(gè)個(gè)園丁就就需要對對所有的的產(chǎn)品負(fù)負(fù)責(zé),成成了農(nóng)場場的關(guān)鍵鍵人物, 他什么么時(shí)候不不能正常常工作了了,整個(gè)個(gè)農(nóng)場都都要受

39、到到影響; 2)將這么么多的邏邏輯集中中放在一一個(gè)類里里面的另另外一個(gè)個(gè)缺點(diǎn)是是,當(dāng)產(chǎn)產(chǎn)品類有有不同的的接口種種類時(shí),工廠需需要判斷斷在什么么時(shí)候創(chuàng)創(chuàng)建某種種產(chǎn)品, 這種對對時(shí)機(jī)的的判斷和和對哪一一種具體體產(chǎn)品的的判斷邏邏輯混合合在一起起,使得得系統(tǒng)在在將來進(jìn)進(jìn)行功能能擴(kuò)展時(shí)時(shí)較為困困難。 這一缺缺點(diǎn)在工工廠方法法模式中中得到克克服 3)由于簡簡單工廠廠模式使使用靜態(tài)態(tài)方法作作為工廠廠反尬,而靜態(tài)態(tài)方法無無法由子子類繼承承,因此此工廠角角色無法法形成基基于繼承承的等級(jí)級(jí)結(jié)構(gòu)。 這一一缺點(diǎn)會(huì)會(huì)在工廠廠方法模模式中得得到克服服 7、“開閉”原則要要求一個(gè)個(gè)系統(tǒng)的的設(shè)計(jì)能能夠允許許系統(tǒng)在在無需修修改

40、的情情況下,擴(kuò)展其其功能。 要要求系統(tǒng)統(tǒng)允許當(dāng)當(dāng)新的產(chǎn)產(chǎn)品加入入系統(tǒng)中中時(shí),而而無需對對現(xiàn)有代代碼進(jìn)行行修改,這一點(diǎn)點(diǎn)對于產(chǎn)產(chǎn)品消費(fèi)費(fèi)者角色色是成立立的,而而對于工工廠角色色是不成成立的 一般般而言:一個(gè)系系統(tǒng)總是是可以劃劃分成為為產(chǎn)品的的消費(fèi)者者角色(Cliientt)、產(chǎn)產(chǎn)品的工工廠角色色(Faactoory)以及產(chǎn)產(chǎn)品角色色(Prroduuct)三個(gè)子子系統(tǒng) 對于于產(chǎn)品消消費(fèi)者角角色來說說,任何何時(shí)候需需要某種種產(chǎn)品,只需向向工廠角角色請求求即可,而工廠廠角色在在接到請請求后, 會(huì)自自行判斷斷創(chuàng)建和和提供哪哪一個(gè)產(chǎn)產(chǎn)品,所所以,產(chǎn)產(chǎn)品消費(fèi)費(fèi)者角色色無需知知道它得得到的是是哪一個(gè)個(gè)產(chǎn)品,

41、產(chǎn)品品消費(fèi)者者角色無無需修改改就可以以接納新新的產(chǎn)品品,而接接納新的的產(chǎn)品意意味著要要修改這這個(gè)工廠廠角色的的源代碼碼 (簡簡單工廠廠角色只只在有限限的程度度上支持持“開閉”原則)工廠方法法(Faactoory Metthodd)模式式:1、工廠廠方法模模式是類類的創(chuàng)建建模式,又叫做做虛擬構(gòu)構(gòu)造子模模式或者者多態(tài)性性工廠模模式 工工廠方法法模式的的用意是是定義一一個(gè)創(chuàng)建建產(chǎn)品對對象的工工廠接口口,將實(shí)實(shí)際創(chuàng)建建工作推推遲到子子類中。 一般而言言工廠方方法模式式的系統(tǒng)統(tǒng)設(shè)計(jì)到到以下幾幾種角色色: 1) 抽抽象工廠廠(Crreattor)角色:擔(dān)任這這個(gè)角色色的是工工廠方法法模式的的核心,它是與與

42、應(yīng)用程程序無關(guān)關(guān)的, 任何在在模式之之中個(gè)窗窗對象的的工廠類類必須實(shí)實(shí)現(xiàn)這個(gè)個(gè)接口,在實(shí)際際系統(tǒng)中中,這個(gè)個(gè)角色也也使用抽抽象類實(shí)實(shí)現(xiàn) 2) 具具體工廠廠(Cooncrretee Crreattor)角色:擔(dān)任這這個(gè)角色色的是實(shí)實(shí)現(xiàn)了抽抽象工廠廠接口的的具體jjavaa類。 具體工工廠角色色含有與與用應(yīng)密密切相關(guān)關(guān)的邏輯輯,并且且受到應(yīng)應(yīng)用程序序的調(diào)用用以創(chuàng)建建產(chǎn)品對對象。 3) 抽抽象產(chǎn)品品角色:工廠方方法模式式所創(chuàng)建建的對象象的超類類型,也也就是產(chǎn)產(chǎn)品對象象的共同同父類或或共同擁擁有的接接口, 在實(shí)際際應(yīng)用中中,這個(gè)個(gè)角色也也常常使使用抽象象javva類實(shí)實(shí)現(xiàn) 4) 具具體產(chǎn)品品角色:這個(gè)

43、角角色實(shí)現(xiàn)現(xiàn)了抽象象產(chǎn)品角角色所聲聲明的接接口。工工廠方法法模式所所創(chuàng)建的的每一個(gè)個(gè)對象都都是某個(gè)個(gè)具體產(chǎn)產(chǎn)品角色色的實(shí)例例 Javaa代碼 1.2、舉例: 2. /抽象象工廠(角色)接口 3. ppubllic intterffacee Crreattor 4. /工工廠方法法 5. pubblicc Prroduuct facctorry(); 6. 7. 8. /抽象象產(chǎn)品(角色)接口 9. ppubllic intterffacee Prroduuct 10. 11. /一個(gè)沒沒有聲明明任何方方法的接接口叫做做標(biāo)識(shí)接接口 12. 13. /具具體工廠廠(角色色)類 14. pubbli

44、cc cllasss CooncrreteeCreeatoor1 impplemmentts CCreaatorr 15. /工廠方方法 16. puubliic PProdductt faactoory() 17. rretuurn neww CooncrreteeProoducct1(); 18. 19. 20. 21. pubblicc cllasss CooncrreteeCreeatoor2 impplemmentts CCreaatorr 22. /工廠方方法 23. puubliic PProdductt faactoory() 24. rretuurn neww Cooncrr

45、eteeProoducct2(); 25. 26. 27. 28. /具具體產(chǎn)品品(角色色)類 29. pubblicc cllasss CooncrreteeProoducct1 impplemmentts PProdductt 30. puubliic CConccrettePrroduuct11() 31. /doo soomthhingg 32. 33. 34.35. pubblicc cllasss CooncrreteeProoducct2 impplemmentts PProdductt 36. puubliic CConccrettePrroduuct22() 37. /doo

46、 soomthhingg 38. 39. 40. 41. /客客戶端(角色)類 42. pubblicc cllasss Clliennt 43. prrivaate staaticc Crreattor creeatoor1,creeatoor2; 44. prrivaate staaticc Prroduuct prood1,prood2; 45. 46. puubliic sstattic voiid mmainn(Sttrinng aargss) 47. ccreaatorr1 = neew CConccretteCrreattor11(); 48. pprodd1 = crreatt

47、or11.faactoory(); 49. ccreaatorr2 = neew CConccretteCrreattor22(); 50. pprodd2 = crreattor22.faactoory(); 51. 52. 2、舉例例:/抽抽象工廠廠(角色色)接口口pubblicc innterrfacce CCreaatorr/工廠方方法puubliic PProdductt faactoory();/抽抽象產(chǎn)品品(角色色)接口口pubblicc innterrfacce PProdductt/一一個(gè)沒有有聲明任任何方法法的接口口叫做標(biāo)標(biāo)識(shí)接口口/具具體工廠廠(角色色)類pubblicc

48、 cllasss CooncrreteeCreeatoor1 impplemmentts CCreaatorr/工廠方方法puubliic PProdductt faactoory()rretuurn neww CooncrreteeProoducct1();pubblicc cllasss CooncrreteeCreeatoor2 impplemmentts CCreaatorr/工廠方方法puubliic PProdductt faactoory()rretuurn neww CooncrreteeProoducct2();/具具體產(chǎn)品品(角色色)類pubblicc cllasss Co

49、oncrreteeProoducct1 impplemmentts PProdducttpuubliic CConccrettePrroduuct11()/doo soomthhinggpubblicc cllasss CooncrreteeProoducct2 impplemmentts PProdducttpuubliic CConccrettePrroduuct22()/doo soomthhingg/客客戶端(角色)類pubblicc cllasss Cllienntprrivaate staaticc Crreattor creeatoor1,creeatoor2;prrivaate

50、 staaticc Prroduuct prood1,prood2;puubliic sstattic voiid mmainn(Sttrinng aargss)ccreaatorr1 = neew CConccretteCrreattor11();pprodd1 = crreattor11.faactoory();ccreaatorr2 = neew CConccretteCrreattor22();pprodd2 = crreattor22.faactoory();Clieent對對象的活活動(dòng)可以以分為兩兩部分 1) 客客戶端創(chuàng)創(chuàng)建 CConccretteCrreattor11 對象象,這

51、時(shí)時(shí)客戶端端所持有有變量的的靜態(tài)類類型是CCreaatorr,而實(shí)實(shí)際類型型是 CConccretteCrreattor11,然后后,客戶戶端調(diào)用用 CooncrreteeCreeatoor1 對象的的工廠方方法 ffacttoryy() ,接著著后者調(diào)調(diào)用 CConccrettePrroduuct11 的構(gòu)構(gòu)造子創(chuàng)創(chuàng)建出產(chǎn)產(chǎn)品對象象 Javaa代碼 1.2、舉例: 2. /抽抽象工廠廠角色(水果園園?。?3. pubblicc innterrfacce FFruiitGaardeenerr 4. /工廠方方法 5. puubliic FFruiit ffacttoryy(); 6. 7. 8

52、. /具具體工廠廠類(蘋蘋果園丁丁) 9. pubblicc cllasss ApppleeGarrdenner impplemmentts FFruiitGaardeenerr 10. ppubllic Fruuit facctorry() 11. retturnn neew AApplle(); 12. 13. 14. 15. /.(草莓莓園?。?16. puubliic cclasss SStraawbeerryyGarrdenner impplemmentts FFuriitGaardeenerr 17. ppubllic Fruuit facctorry() 18. retturnn

53、 neew SStraawbeerryy(); 19. 20. 21. 22. /.(葡萄萄園?。?23. puubliic cclasss GGrappeGaardeenerr immpleemennts FurritGGarddeneer 24. ppubllic Fruuit facctorry() 25. retturnn neew GGrappe(); 26. 27. 28. 29. /抽象產(chǎn)產(chǎn)品角色色(水果果接口) 30. puubliic iinteerfaace Fruuit 31. vvoidd grrow(); 32. vvoidd haarveest(); 33. vvo

54、idd pllantt(); 34. 35. 36. /具體產(chǎn)產(chǎn)品角色色(蘋果果類) 37. puubliic cclasss AApplle iimpllemeentss Frruitt 38. pprivvatee innt ttreeeAgee; 39. 40. ppubllic voiid ggroww() 41. logg(AApplle iis ggrowwingg.); 42. 43. 44. ppubllic voiid hharvvestt() 45. logg(AApplle hhas beeen hharvvestted.); 46. 47. 48. ppubllic v

55、oiid pplannt() 49. logg(AApplle hhas beeen pplanntedd.); 50. 51. 52. ppubllic staaticc vooid logg(Sttrinng mmsg) 53. Sysstemm.ouut.pprinntlnn(mssg); 54. 55. 56. ppubllic intt geetTrreeAAge() 57. retturnn trreeAAge; 58. 59. 60. ppubllic voiid ssetTTreeeAgee(innt ttreeeAgee) 61. thiis.ttreeeAgee = tre

56、eeAgge; 62. 63. 64. /其他同同上. 2、舉例例:/抽象工工廠角色色(水果果園?。﹑uubliic iinteerfaace FruuitGGarddeneer/工廠廠方法ppubllic Fruuit facctorry();/具體工工廠類(蘋果園園丁)puubliic cclasss AApplleGaardeenerr immpleemennts FruuitGGarddeneerppubllic Fruuit facctorry()retturnn neew AApplle();/.(草莓莓園?。﹑uubliic cclasss SStraawbeerryyGarrd

57、enner impplemmentts FFuriitGaardeenerrppubllic Fruuit facctorry()retturnn neew SStraawbeerryy();/.(葡萄萄園?。﹑uubliic cclasss GGrappeGaardeenerr immpleemennts FurritGGarddeneerppubllic Fruuit facctorry()retturnn neew GGrappe();/抽象產(chǎn)產(chǎn)品角色色(水果果接口)puubliic iinteerfaace Fruuitvvoidd grrow();vvoidd haarveest()

58、;vvoidd pllantt();/具體產(chǎn)產(chǎn)品角色色(蘋果果類)puubliic cclasss AApplle iimpllemeentss Frruittpprivvatee innt ttreeeAgee;ppubllic voiid ggroww()logg(AApplle iis ggrowwingg.);ppubllic voiid hharvvestt()logg(AApplle hhas beeen hharvvestted.);ppubllic voiid pplannt()logg(AApplle hhas beeen pplanntedd.);ppubllic staa

59、ticc vooid logg(Sttrinng mmsg)Sysstemm.ouut.pprinntlnn(mssg);ppubllic intt geetTrreeAAge()retturnn trreeAAge;ppubllic voiid ssetTTreeeAgee(innt ttreeeAgee)thiis.ttreeeAgee = treeeAgge;/其他同同上.3、工廠廠方法返返還的類類型 工廠返還還的應(yīng)當(dāng)當(dāng)是抽象象類型,而不是是具體類類型,只只有這樣樣才能保保證整隊(duì)隊(duì)產(chǎn)品的的多態(tài)性性,調(diào)用用該工廠廠方法的的客戶端端可以針針對抽象象編程,依賴于于一個(gè)抽抽象產(chǎn)品品類型,而不是是

60、具體產(chǎn)產(chǎn)品類型型。 在特殊情情況下,工廠方方法僅僅僅返還一一個(gè)具體體產(chǎn)品類類型,這這個(gè)時(shí)候候工廠方方法模式式的功能能就退化化了,表表現(xiàn)為針針對產(chǎn)品品角色的的多態(tài)性性的喪失失,客戶戶端從工工廠方法法的靜態(tài)態(tài)類型可可以知道道將要得得到的是是什么類類型的對對象,而而這違背背了工廠廠方法模模式的用用意 4、與其其他模式式的關(guān)系系 1、模板板方法模模式 工廠方法法模式常常常與模模板方法法模式一一起聯(lián)合合使用,其原因因有二: 一、兩個(gè)個(gè)模式都都是基于于方法的的,工廠廠方法模模式是基基于多態(tài)態(tài)性的工工廠方法法的,而而模板方方法模式式是基于于模板方方法和基基于方法法的 二、兩個(gè)個(gè)模式的的哦將具具體工作作交給子

溫馨提示

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

評論

0/150

提交評論