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

下載本文檔

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

文檔簡(jiǎn)介

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

2、實(shí)例化這種細(xì)節(jié)。 4、原始模型模式:通過給出一個(gè)原型對(duì)象來指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制那個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象。原始模型模式同意動(dòng)態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。 5、單例模式:?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供那個(gè)實(shí)例單例模式。單例模式只應(yīng)在有真正的“單一實(shí)例”的需求時(shí)才可使用。 6、適配器(變壓器)模式:把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口緣故不匹配而無法一起工作的兩個(gè)類能夠一起工作。適配類能夠依照參數(shù)返還一

3、個(gè)合適的實(shí)例給客戶端。 7、橋梁模式:將抽象化與實(shí)現(xiàn)化脫耦,使得二者能夠獨(dú)立的變化,也確實(shí)是講將他們之間的強(qiáng)關(guān)聯(lián)變成弱關(guān)聯(lián),也確實(shí)是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者能夠獨(dú)立的變化。 8、合成模式:合成模式將對(duì)象組織到樹結(jié)構(gòu)中,能夠用來描述整體與部分的關(guān)系。合成模式確實(shí)是一個(gè)處理對(duì)象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個(gè)個(gè)單獨(dú)的成分對(duì)象和由他們復(fù)合而成的合成對(duì)象同等看待。 9、裝飾模式:裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對(duì)象增加功能,

4、這些功能能夠再動(dòng)態(tài)的撤消。增加由一些差不多功能的排列組合而產(chǎn)生的特不大量的功能。 10、門面模式:外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)實(shí)例,也確實(shí)是講它是一個(gè)單例模式。但整個(gè)系統(tǒng)能夠有多個(gè)門面類。 11、享元模式:FLYWEIGHT在拳擊競(jìng)賽中指最輕量級(jí)。享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。內(nèi)蘊(yùn)狀態(tài)存儲(chǔ)在享元內(nèi)部,可不能隨環(huán)境的改變而有所不同。外蘊(yùn)狀態(tài)是隨環(huán)境的改變而改變的。外蘊(yùn)狀態(tài)不能阻礙內(nèi)蘊(yùn)狀態(tài),它們是相互獨(dú)立的

5、。將能夠共享的狀態(tài)和不能夠共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不能夠共享的狀態(tài)從類里剔除出去??蛻舳瞬荒軌蛑苯觿?chuàng)建被共享的對(duì)象,而應(yīng)當(dāng)使用一個(gè)工廠對(duì)象負(fù)責(zé)創(chuàng)建被共享的對(duì)象。享元模式大幅度的降低內(nèi)存中對(duì)象的數(shù)量。 12、代理模式:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象操縱對(duì)源對(duì)象的引用。代理確實(shí)是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)。某些情況下,客戶不想或者不能夠直接引用一個(gè)對(duì)象,代理對(duì)象能夠在客戶和目標(biāo)對(duì)象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對(duì)象與真實(shí)主題對(duì)象。代理模式能夠并不明白真正的被代理對(duì)象,而僅僅持有一個(gè)被代理對(duì)象的接口,這時(shí)候代理對(duì)象不能夠創(chuàng)建被代理對(duì)象,被

6、代理對(duì)象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。 13、責(zé)任鏈模式:在責(zé)任鏈模式中,專門多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而接 起來形成一條鏈。請(qǐng)求在那個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求??蛻舨⒉幻靼祖溕系哪囊粋€(gè)對(duì)象最終處理那個(gè)請(qǐng)求,系統(tǒng)能夠在不阻礙客戶端的情況下動(dòng)態(tài)的重新組織鏈和分配責(zé)任。處理者有兩個(gè)選擇:承擔(dān)責(zé)任或者把責(zé)任推給下家。一個(gè)請(qǐng)求能夠最終不被任何接收端對(duì)象所同意。 14、命令模式:命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,委派給不同的對(duì)象。命令模式同意請(qǐng)求的一方和發(fā)送的一方獨(dú)立開來,使得請(qǐng)求的一方不必明白接收請(qǐng)求的一方的接口

7、,更不必明白請(qǐng)求是如何被接收,以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是如何被執(zhí)行的。系統(tǒng)支持命令的撤消。 15、解釋器模式:給定一個(gè)語言后,解釋器模式能夠定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器??蛻舳四軌蚴褂媚莻€(gè)解釋器來解釋那個(gè)語言中的句子。解釋器模式將描述如何樣在有了一個(gè)簡(jiǎn)單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對(duì)象能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級(jí)結(jié)構(gòu),也確實(shí)是一系列的組合規(guī)則。每一個(gè)命令對(duì)象都有一個(gè)解釋方法,代表對(duì)命令對(duì)象的解釋。命令對(duì)象的等級(jí)結(jié)構(gòu)中的對(duì)象的任何排列組合差不多上一個(gè)語言。 16、迭代子模式:迭代子模式

8、能夠順序訪問一個(gè)聚攏中的元素而不必暴露聚攏的內(nèi)部表象。多個(gè)對(duì)象聚在一起形成的總體稱之為聚攏,聚攏對(duì)象是能夠包容一組對(duì)象的容器對(duì)象。迭代子模式將迭代邏輯封裝到一個(gè)獨(dú)立的子對(duì)象中,從而與聚攏本身隔開。迭代子模式簡(jiǎn)化了聚攏的界面。每一個(gè)聚攏對(duì)象都能夠有一個(gè)或一個(gè)以上的迭代子對(duì)象,每一個(gè)迭代子的迭代狀態(tài)能夠是彼此獨(dú)立的。迭代算法能夠獨(dú)立于聚攏角色變化。 17、調(diào)停者模式:調(diào)停者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必相互明顯作用。從而使他們能夠松散偶合。當(dāng)某些對(duì)象之間的作用發(fā)生改變時(shí),可不能立即阻礙其他的一些對(duì)象之間的作用。保證這些作用能夠彼此獨(dú)立的變化。調(diào)停者模式將多對(duì)多的相互作用轉(zhuǎn)化為

9、一對(duì)多的相互作用。調(diào)停者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開處理。 18、備忘錄模式:備忘錄對(duì)象是一個(gè)用來存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照的對(duì)象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并外部化,存儲(chǔ)起來,從而能夠在今后合適的時(shí)候把那個(gè)對(duì)象還原到存儲(chǔ)起來的狀態(tài)。 19、觀看者模式:觀看者模式定義了一種一隊(duì)多的依靠關(guān)系,讓多個(gè)觀看者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。那個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀看者對(duì)象,使他們能夠自動(dòng)更新自己。 20、狀態(tài)模式:狀態(tài)模式同意一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。那個(gè)對(duì)象看上去象是改變了它的類一

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

11、方法模式:模板方法模式預(yù)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類能夠以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。先制定一個(gè)頂級(jí)邏輯框架,而將邏輯的細(xì)節(jié)留給具體的子類去實(shí)現(xiàn)。 23、訪問者模式:訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改的話,同意那個(gè)操作的數(shù)據(jù)結(jié)構(gòu)能夠保持不變。訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對(duì)未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合能夠相對(duì)自由的演化。訪問者模式使得增加新的操作變的專門容易,確實(shí)是增加一個(gè)新的訪問者類。訪問

12、者模式將有關(guān)的行為集中到一個(gè)訪問者對(duì)象中,而不是分散到一個(gè)個(gè)的節(jié)點(diǎn)類中。當(dāng)使用訪問者模式時(shí),要將盡可能多的對(duì)象掃瞄邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式能夠跨過幾個(gè)類的等級(jí)結(jié)構(gòu)訪問屬于不同的等級(jí)結(jié)構(gòu)的成員類。工廠模式的幾種形態(tài):1、簡(jiǎn)單工廠模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式。 2、工廠方法模式,又稱為多態(tài)性工廠(Polymorphic Factory)模式 3、抽象工廠模式,又稱工具(Kit或ToolKit)模式 簡(jiǎn)單工廠模式(Simple Factory) 1、模式: 簡(jiǎn)單工廠模式是類的創(chuàng)建模式,又叫做靜態(tài)工廠方法(Static Fact

13、ory Method)模式。 它是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。 Java代碼 1.2、舉例: 2. /水果接口 3. public interface Fruit 4. void grow(); /生長(zhǎng) 5. void harvest(); /收獲 6. void plant(); /種植 7. 8. 9. /蘋果類 10. public class Apple implements Fruit 11. private int treeAge /樹齡 12. 13. public void grow() 14. log(Apple is growing.); 15. 16. 1

14、7. public void harvest() 18. log(Apple has been harvented.); 19. 20. 21. public void plant() 22. log(Apple has been planted.); 23. 24. 25. /輔助方法 26. public static void log(String msg) 27. System.out.println(msg); 28. 29. 30. public int getTreeAge() 31. return treeAge; 32. 33. 34. public void setTree

15、Age(int treeAge) 35. this.treeAge = treeAge; 36. 37. 38. 39. /葡萄類 40. public class Grape implements Fruit 41. private boolean seedless; 42. 43. public void grow() 44. log(Grape is growing.); 45. 46. 47. public void harvest() 48. log(Grape has been harvested.); 49. 50. 51. public void plant() 52. log

16、(Grape has been planted.); 53. 54. 55. public static void log(String msg) 56. System.out.println(msg); 57. 58. 59. /有無籽方法 60. public boolean getSeedless() 61. return seedless; 62. 63. 64. public void setSeedlees(boolean seedless) 65. this.seedless = seedless; 66. 67. 68. 69. /草莓類 70. public class St

17、rawberry implements Fruit 71. public void grow() 72. log(Strawberry is growing.); 73. 74. 75. public void harvest() 76. log(Strawberry has been harvested.); 77. 78. 79. public void plant() 80. log(Strawberry has been planted.); 81. 82. 83. public static void log(String msg) 84. System.out.println(ms

18、g); 85. 86. 87. 88. /農(nóng)場(chǎng)園丁類,由他決定創(chuàng)建哪種水果類的實(shí)例 89. public class FruitGardener 90. /靜態(tài)工廠方法 91. public static Fruit factory(String which) throws BadFruitException 92. if(which.equalslgnoreCase(apple) 93. return new Apple(); 94. else if(which.equalslgnoreCase(grape) 95. return new Grape(); 96. else if(which

19、.equalslgnoreCase(strawberry) 97. return new Strawberry(); 98. else 99. throw new BadFruitException(Bad fruit request); 100. 101. 102. 103. 104. /異常類 105. public class BadFruitException extends Exception 106. public BadFruitException(String msg) 107. super(msg); 108. 109. 110. 111. /測(cè)試類 112. public

20、class Test 113. FruitGardener gardener =new FruitGardener(); 114. try 115. gardener.factory(grape); 116. gardener.factory(apple); 117. gardener.factory(strawberry); 118. gardener.factory(banana); /拋出異常 119. catch(BadFruitException e) 120. System.out.println(dontt has this fruit.); 121. 122. 123. 2、舉

21、例:/水果接口public interface Fruitvoid grow();/生長(zhǎng)void harvest();/收獲void plant();/種植/蘋果類public class Apple implements Fruitprivate int treeAge/樹齡public void grow()log(Apple is growing.);public void harvest()log(Apple has been harvented.);public void plant()log(Apple has been planted.);/輔助方法public static v

22、oid log(String msg)System.out.println(msg);public int getTreeAge()return treeAge;public void setTreeAge(int treeAge)this.treeAge = treeAge;/葡萄類public class Grape implements Fruitprivate boolean seedless;public void grow()log(Grape is growing.);public void harvest()log(Grape has been harvested.);publ

23、ic void plant()log(Grape has been planted.);public static void log(String msg)System.out.println(msg);/有無籽方法public boolean getSeedless()return seedless;public void setSeedlees(boolean seedless)this.seedless = seedless;/草莓類public class Strawberry implements Fruitpublic void grow()log(Strawberry is gr

24、owing.);public void harvest()log(Strawberry has been harvested.);public void plant()log(Strawberry has been planted.);public static void log(String msg)System.out.println(msg);/農(nóng)場(chǎng)園丁類,由他決定創(chuàng)建哪種水果類的實(shí)例public class FruitGardener/靜態(tài)工廠方法public static Fruit factory(String which) throws BadFruitExceptionif(w

25、hich.equalslgnoreCase(apple)return new Apple();else if(which.equalslgnoreCase(grape)return new Grape();else if(which.equalslgnoreCase(strawberry)return new Strawberry();elsethrow new BadFruitException(Bad fruit request);/異常類public class BadFruitException extends Exceptionpublic BadFruitException(Str

26、ing msg)super(msg);/測(cè)試類public class TestFruitGardener gardener =new FruitGardener();trygardener.factory(grape);gardener.factory(apple);gardener.factory(strawberry);gardener.factory(banana);/拋出異常catch(BadFruitException e)System.out.println(dontt has this fruit.);3、三個(gè)角色: 1、工廠類(Creator)角色:在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)

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

28、的引用就不方便了, 這時(shí)候 就應(yīng)當(dāng)使用聚攏對(duì)象存儲(chǔ)對(duì)產(chǎn)品對(duì)象的引用。 5、其他模式; 1、單例模式:?jiǎn)卫J揭髥卫惖臉?gòu)造子是私有的,從而客戶端不能直接將之實(shí)例化,而必須通過那個(gè)靜態(tài)工廠方法將之實(shí)例化, 而且單例類自身是自己的工廠角色。單例類自己負(fù)責(zé)創(chuàng)建自身的實(shí)例 單例類使用一個(gè)靜態(tài)屬性存儲(chǔ)自己的唯一的實(shí)例,工廠方法永久僅提供這一個(gè)實(shí)例 2、多例模式:它是對(duì)單例模式的推廣,多例模式也禁止外界直接將之實(shí)例化,同時(shí)通過靜態(tài)工廠方法想外界提供循環(huán)使用的自身的實(shí)例, 多例模式能夠有多個(gè)實(shí)例 多例模式具有一個(gè)聚攏屬性,通過向那個(gè)聚攏屬性登記差不多創(chuàng)建過的實(shí)例達(dá)到循環(huán)使用實(shí)例的目的, 它還擁有一個(gè)內(nèi)部狀

29、態(tài),每一個(gè)內(nèi)部狀態(tài)都只有一個(gè)實(shí)例存在 依照外界傳入的參量,工廠方法能夠查詢自己的登記聚攏,假如具有那個(gè)狀態(tài)的實(shí)例差不多存在, 就直接將那個(gè)實(shí)例提供給外界:反之,就首先創(chuàng)建一個(gè)新的滿足要求的實(shí)例,將之登記到聚攏中,然后再提供客戶端。 3、備忘錄模式:?jiǎn)卫J胶投嗬J绞褂靡粋€(gè)屬性或者聚攏屬性來登記所創(chuàng)建的產(chǎn)品對(duì)象,一邊能夠通過查詢那個(gè)屬性或者聚攏屬性 找到并共享差不多創(chuàng)建了的產(chǎn)品對(duì)象,這確實(shí)是備忘錄模式的應(yīng)用。 4、MVC模式:是更高層次上的架構(gòu)模式。 包括:合成模式、策略模式、觀看者模式、也有可能會(huì)包括裝飾模式、調(diào)停者模式、迭代子模式以及工廠方法模式等。 :假如系統(tǒng)需要有多個(gè)操縱器參與那個(gè)過程

30、的話,簡(jiǎn)單工廠模式就不適合了,應(yīng)當(dāng)考慮使用工廠方法模式。 6、簡(jiǎn)單工廠模式的優(yōu)點(diǎn)己缺點(diǎn) 優(yōu)點(diǎn):模式的核心是工廠類,那個(gè)類有必要的推斷邏輯,能夠決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例。 而客戶端則能夠免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅負(fù)責(zé)“消費(fèi)”產(chǎn)品。簡(jiǎn)單工廠模式通過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割 缺點(diǎn):1)那個(gè)工廠類集中了所有的產(chǎn)品創(chuàng)建邏輯,形成一個(gè)無所不知的全能類,有人把這種類叫做上帝類(God Class)。 假如那個(gè)全能類代表的是農(nóng)場(chǎng)的一個(gè)具體園丁的話,那么那個(gè)園丁就需要對(duì)所有的產(chǎn)品負(fù)責(zé),成了農(nóng)場(chǎng)的關(guān)鍵人物, 他什么時(shí)候不能正常工作了,整個(gè)農(nóng)場(chǎng)都要受到阻礙; 2)將這么多的邏輯集中放在一個(gè)類里

31、面的另外一個(gè)缺點(diǎn)是,當(dāng)產(chǎn)品類有不同的接口種類時(shí),工廠需要推斷在什么時(shí)候創(chuàng)建某種產(chǎn)品, 這種對(duì)時(shí)機(jī)的推斷和對(duì)哪一種具體產(chǎn)品的推斷邏輯混合在一起,使得系統(tǒng)在今后進(jìn)行功能擴(kuò)展時(shí)較為困難。 這一缺點(diǎn)在工廠方法模式中得到克服 3)由于簡(jiǎn)單工廠模式使用靜態(tài)方法作為工廠反尬,而靜態(tài)方法無法由子類繼承,因此工廠角色無法形成基于繼承的等級(jí)結(jié)構(gòu)。 這一缺點(diǎn)會(huì)在工廠方法模式中得到克服 7、“開閉”原則要求一個(gè)系統(tǒng)的設(shè)計(jì)能夠同意系統(tǒng)在無需修改的情況下,擴(kuò)展其功能。 要求系統(tǒng)同意當(dāng)新的產(chǎn)品加入系統(tǒng)中時(shí),而無需對(duì)現(xiàn)有代碼進(jìn)行修改,這一點(diǎn)關(guān)于產(chǎn)品消費(fèi)者角色是成立的,而關(guān)于工廠角色是不成立的 一般而言:一個(gè)系統(tǒng)總是能夠劃分成

32、為產(chǎn)品的消費(fèi)者角色(Client)、產(chǎn)品的工廠角色(Factory)以及產(chǎn)品角色(Product)三個(gè)子系統(tǒng) 關(guān)于產(chǎn)品消費(fèi)者角色來講,任何時(shí)候需要某種產(chǎn)品,只需向工廠角色請(qǐng)求即可,而工廠角色在接到請(qǐng)求后, 會(huì)自行推斷創(chuàng)建和提供哪一個(gè)產(chǎn)品,因此,產(chǎn)品消費(fèi)者角色無需明白它得到的是哪一個(gè)產(chǎn)品, 產(chǎn)品消費(fèi)者角色無需修改就能夠接納新的產(chǎn)品,而接納新的產(chǎn)品意味著要修改那個(gè)工廠角色的源代碼 (簡(jiǎn)單工廠角色只在有限的程度上支持“開閉”原則)工廠方法(Factory Method)模式:1、工廠方法模式是類的創(chuàng)建模式,又叫做虛擬構(gòu)造子模式或者多態(tài)性工廠模式 工廠方法模式的用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將

33、實(shí)際創(chuàng)建工作推遲到子類中。 一般而言工廠方法模式的系統(tǒng)設(shè)計(jì)到以下幾種角色: 1) 抽象工廠(Creator)角色:擔(dān)任那個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用程序無關(guān)的, 任何在模式之中個(gè)窗對(duì)象的工廠類必須實(shí)現(xiàn)那個(gè)接口,在實(shí)際系統(tǒng)中,那個(gè)角色也使用抽象類實(shí)現(xiàn) 2) 具體工廠(Concrete Creator)角色:擔(dān)任那個(gè)角色的是實(shí)現(xiàn)了抽象工廠接口的具體java類。 具體工廠角色含有與用應(yīng)緊密相關(guān)的邏輯,同時(shí)受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。 3) 抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也確實(shí)是產(chǎn)品對(duì)象的共同父類或共同擁有的接口, 在實(shí)際應(yīng)用中,那個(gè)角色也常常使用抽象java類實(shí)現(xiàn)

34、 4) 具體產(chǎn)品角色:那個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所聲明的接口。工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象差不多上某個(gè)具體產(chǎn)品角色的實(shí)例 Java代碼 1.2、舉例: 2. /抽象工廠(角色)接口 3. public interface Creator 4. /工廠方法 5. public Product factory(); 6. 7. 8. /抽象產(chǎn)品(角色)接口 9. public interface Product 10. 11. /一個(gè)沒有聲明任何方法的接口叫做標(biāo)識(shí)接口 12. 13. /具體工廠(角色)類 14. public class ConcreteCreator1 implements

35、Creator 15. /工廠方法 16. public Product factory() 17. return new ConcreteProduct1(); 18. 19. 20. 21. public class ConcreteCreator2 implements Creator 22. /工廠方法 23. public Product factory() 24. return new ConcreteProduct2(); 25. 26. 27. 28. /具體產(chǎn)品(角色)類 29. public class ConcreteProduct1 implements Product

36、 30. public ConcreteProduct1() 31. /do somthing 32. 33. 34. 35. public class ConcreteProduct2 implements Product 36. public ConcreteProduct2() 37. /do somthing 38. 39. 40. 41. /客戶端(角色)類 42. public class Client 43. private static Creator creator1,creator2; 44. private static Product prod1,prod2; 45.

37、46. public static void main(String args) 47. creator1 = new ConcreteCreator1(); 48. prod1 = creator1.factory(); 49. creator2 = new ConcreteCreator2(); 50. prod2 = creator2.factory(); 51. 52. 2、舉例:/抽象工廠(角色)接口public interface Creator/工廠方法public Product factory();/抽象產(chǎn)品(角色)接口public interface Product/一個(gè)沒

38、有聲明任何方法的接口叫做標(biāo)識(shí)接口/具體工廠(角色)類public class ConcreteCreator1 implements Creator/工廠方法public Product factory()return new ConcreteProduct1();public class ConcreteCreator2 implements Creator/工廠方法public Product factory()return new ConcreteProduct2();/具體產(chǎn)品(角色)類public class ConcreteProduct1 implements Productpu

39、blic ConcreteProduct1()/do somthingpublic class ConcreteProduct2 implements Productpublic ConcreteProduct2()/do somthing/客戶端(角色)類public class Clientprivate static Creator creator1,creator2;private static Product prod1,prod2;public static void main(String args)creator1 = new ConcreteCreator1();prod1

40、= creator1.factory();creator2 = new ConcreteCreator2();prod2 = creator2.factory();Client對(duì)象的活動(dòng)能夠分為兩部分 1) 客戶端創(chuàng)建 ConcreteCreator1 對(duì)象,這時(shí)客戶端所持有變量的靜態(tài)類型是Creator,而實(shí)際類型是 ConcreteCreator1,然后,客戶端調(diào)用 ConcreteCreator1 對(duì)象的工廠方法 factory() ,接著后者調(diào)用 ConcreteProduct1 的構(gòu)造子創(chuàng)建出產(chǎn)品對(duì)象 Java代碼 1.2、舉例: 2. /抽象工廠角色(水果園?。?3. public

41、 interface FruitGardener 4. /工廠方法 5. public Fruit factory(); 6. 7. 8. /具體工廠類(蘋果園?。?9. public class AppleGardener implements FruitGardener 10. public Fruit factory() 11. return new Apple(); 12. 13. 14. 15. /(草莓園?。?16. public class StrawberryGardener implements FuritGardener 17. public Fruit factory()

42、 18. return new Strawberry(); 19. 20. 21. 22. /(葡萄園?。?23. public class GrapeGardener implements FuritGardener 24. public Fruit factory() 25. return new Grape(); 26. 27. 28. 29. /抽象產(chǎn)品角色(水果接口) 30. public interface Fruit 31. void grow(); 32. void harvest(); 33. void plant(); 34. 35. 36. /具體產(chǎn)品角色(蘋果類) 37

43、. public class Apple implements Fruit 38. private int treeAge; 39. 40. public void grow() 41. log(Apple is growing.); 42. 43. 44. public void harvest() 45. log(Apple has been harvested.); 46. 47. 48. public void plant() 49. log(Apple has been planted.); 50. 51. 52. public static void log(String msg)

44、 53. System.out.println(msg); 54. 55. 56. public int getTreeAge() 57. return treeAge; 58. 59. 60. public void setTreeAge(int treeAge) 61. this.treeAge = treeAge; 62. 63. 64. /其他同上 2、舉例:/抽象工廠角色(水果園?。﹑ublic interface FruitGardener/工廠方法public Fruit factory();/具體工廠類(蘋果園?。﹑ublic class AppleGardener imple

45、ments FruitGardenerpublic Fruit factory()return new Apple();/(草莓園?。﹑ublic class StrawberryGardener implements FuritGardenerpublic Fruit factory()return new Strawberry();/(葡萄園?。﹑ublic class GrapeGardener implements FuritGardenerpublic Fruit factory()return new Grape();/抽象產(chǎn)品角色(水果接口)public interface Fr

46、uitvoid grow();void harvest();void plant();/具體產(chǎn)品角色(蘋果類)public class Apple implements Fruitprivate int treeAge;public void grow()log(Apple is growing.);public void harvest()log(Apple has been harvested.);public void plant()log(Apple has been planted.);public static void log(String msg)System.out.prin

47、tln(msg);public int getTreeAge()return treeAge;public void setTreeAge(int treeAge)this.treeAge = treeAge;/其他同上3、工廠方法返還的類型 工廠返還的應(yīng)當(dāng)是抽象類型,而不是具體類型,只有如此才能保證整隊(duì)產(chǎn)品的多態(tài)性,調(diào)用該工廠方法的客戶端能夠針對(duì)抽象編程,依靠于一個(gè)抽象產(chǎn)品類型,而不是具體產(chǎn)品類型。 在專門情況下,工廠方法僅僅返還一個(gè)具體產(chǎn)品類型,那個(gè)時(shí)候工廠方法模式的功能就退化了,表現(xiàn)為針對(duì)產(chǎn)品角色的多態(tài)性的喪失,客戶端從工廠方法的靜態(tài)類型能夠明白將要得到的是什么類型的對(duì)象,而這違背了工廠

48、方法模式的用意 4、與其他模式的關(guān)系 1、模板方法模式 工廠方法模式常常與模板方法模式一起聯(lián)合使用,其緣故有二: 一、兩個(gè)模式差不多上基于方法的,工廠方法模式是基于多態(tài)性的工廠方法的,而模板方法模式是基于模板方法和基于方法的 二、兩個(gè)模式的哦將具體工作交給子類,工廠方法模式將創(chuàng)建工作推延給子類,模板方法模式將生于邏輯交給子類 2、MVC模式 工廠方法模式總是設(shè)計(jì)到兩個(gè)等級(jí)結(jié)構(gòu)中的對(duì)象,而這兩個(gè)等級(jí)結(jié)構(gòu)能夠分不是MVC模式中的操縱器和視圖。一個(gè)MVC模式能夠有多個(gè)操縱器和多個(gè)視圖,操縱器端能夠創(chuàng)建合適的視圖斷,如同工廠角色創(chuàng)建合適的對(duì)象角色一樣,模型端則能夠充當(dāng)那個(gè)創(chuàng)建過程的客戶端 3、亨元模式

49、 使用了帶有邏輯的工廠方法 4、備忘錄模式 亨元模式使用了一個(gè)聚攏來等級(jí)所創(chuàng)建的產(chǎn)品對(duì)象,以便能夠通過查詢那個(gè)聚攏找到和共享差不多創(chuàng)建了的產(chǎn)品對(duì)象,這確實(shí)是備忘錄模式的應(yīng)用 Java代碼 1.5、舉例: 2. 問題:某一個(gè)商業(yè)軟件產(chǎn)品需要支持Sybase和Oracle數(shù)據(jù)庫。那個(gè)系統(tǒng)需要如此一個(gè)查詢運(yùn)行期系統(tǒng),依照客戶需要,能夠隨時(shí)向Sybase和Oracle數(shù)據(jù)庫引擎發(fā)出查詢 3. 答案:能夠看出,那個(gè)系統(tǒng)是由一個(gè)客戶端Client,一個(gè)抽象工廠角色QueryRunner,兩個(gè)具體工廠角色SybaseQueryRunner和OracleQueryRunner,以及產(chǎn)品角色組成的 4. 關(guān)于客

50、戶端Client而言,系統(tǒng)的抽象產(chǎn)品角色是ResultSet接口,而具體產(chǎn)品角色確實(shí)是java.sql.Connection所返還的具體ResultSet對(duì)象,createSql()方法和createConnection()方法實(shí)際上也是工廠方法,他們的產(chǎn)品是SQL語句和Connection對(duì)象 5. /java抽象類QueryRunner 6. import java.sql.Connection; 7. import java.sql.ResultSet; 8. 9. public abstract class QueryRunner 10. public ResultSet run()

51、throws Exception 11. Connection conn = createConnection(); 12. String sql = createSql(); 13. return runSql(conn,sql); 14. 15. protected abstract Connection createConnection(); 16. protected abstract String createSql(); 17. protected abstract ResultSet runSql(Connection conn.String sql)throws Excepti

52、on; 18. 19. 20. /具體工廠類 21. import java.sql.Connection; 22. import java.sql.Statement; 23. import java.sql.ResultSet; 24. 25. public class SybaseQueryRunner extends QueryRunner 26. public Connection createConnection() 27. return null; 28. 29. 30. protected String createSql() 31. return select * from

53、customers; 32. 33. 34. protected ResultSet runSql(Connection conn,String sql) throws Exception 35. Statement stmt = conn.createStatement(); 36. return stmt.executeQuery(sql); 37. 38. 39. 40. /具體工廠類 41. import java.sql.Connection; 42. import java.sql.Statement; 43. import java.sql.ResultSet; 44. 45.

54、public class OracleQueryRunner extends QueryRunner 46. public Connection createConnection() 47. return null; 48. 49. 50. protected String createSql() 51. return select * from customers; 52. 53. 54. protected ResultSet runSql(Connection conn, String sql) throws Exception 55. Statement stmt = conn.cre

55、ateStatement(); 56. return stmt.executeQuery(sql); 57. 58. 59. 60. /客戶端 61. import java.sql.ResultSet; 62. 63. public class Client 64. private static QueryRunner runner; 65. 66. public static void main(String args) throws Exception 67. runner = new SybaseQueryRunner(); 68. ResultSet rs = runner.run(); 69. 70. 71. 以上給出的答案中,使用了模板方法模式,在QueryRunner中,run()方法確實(shí)是一個(gè)模板方法,那個(gè)方法代表一個(gè)頂極邏輯:返還產(chǎn)尋的結(jié)果ResultSet Java與模式之工廠模式學(xué)習(xí)Facotry Pattern包括了三種形態(tài)Simple Factory Factory Method Abstract Factory 下面分不進(jìn)行學(xué)習(xí)Simple Fac

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論