版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1、工廠模式:客戶類和工廠類分開。消費(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)的接口,而不接觸哪一
2、個(gè)產(chǎn)品類應(yīng)當(dāng)被實(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è)類
3、能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端。 7、橋梁模式:將抽象化與實(shí)現(xiàn)化脫耦,使得二者可以獨(dú)立的變化,也就是說將他們之間的強(qiáng)關(guān)聯(lián)變成弱關(guān)聯(lián),也就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以獨(dú)立的變化。 8、合成模式:合成模式將對(duì)象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就是一個(gè)處理對(duì)象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個(gè)個(gè)單獨(dú)的成分對(duì)象和由他們復(fù)合而成的合成對(duì)象同等看待。 9、裝飾模式:裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承
4、關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對(duì)象增加功能,這些功能可以再動(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í)例,也就是說它是一個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。 11、享元模式:FLYWEIGHT在拳擊比賽中指最輕量級(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ì)隨環(huán)境的改變
5、而有所不同。外蘊(yùn)狀態(tài)是隨環(huán)境的改變而改變的。外蘊(yùn)狀態(tài)不能影響內(nèi)蘊(yùn)狀態(tài),它們是相互獨(dú)立的。將可以共享的狀態(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ì)象的引用。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)。某些情況下,客戶不想或者不能夠直接引用一個(gè)對(duì)象,代理對(duì)象可以在客戶和目標(biāo)對(duì)象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對(duì)象與真實(shí)主題對(duì)象。代理模式可以
6、并不知道真正的被代理對(duì)象,而僅僅持有一個(gè)被代理對(duì)象的接口,這時(shí)候代理對(duì)象不能夠創(chuàng)建被代理對(duì)象,被代理對(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é)任分割開
7、,委派給不同的對(duì)象。命令模式允許請(qǐng)求的一方和發(fā)送的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(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),也就是一系列的組合規(guī)則。每一個(gè)命令對(duì)象都有一個(gè)解釋方
8、法,代表對(duì)命令對(duì)象的解釋。命令對(duì)象的等級(jí)結(jié)構(gòu)中的對(duì)象的任何排列組合都是一個(gè)語言。 16、迭代子模式:迭代子模式可以順序訪問一個(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)某
9、些對(duì)象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(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ā)生
10、變化時(shí),會(huì)通知所有觀察者對(duì)象,使他們能夠自動(dòng)更新自己。 20、狀態(tài)模式:狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。這個(gè)對(duì)象看上去象是改變了它的類一樣。狀態(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ú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的
11、情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,修改都不會(huì)影響到環(huán)境和客戶端。 22、模板方法模式:模板方法模式準(zhǔn)備一個(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)可以保
12、持不變。訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對(duì)未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合可以相對(duì)自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個(gè)新的訪問者類。訪問者模式將有關(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 Facto
13、ry)模式 3、抽象工廠模式,又稱工具(Kit或ToolKit)模式 簡(jiǎn)單工廠模式(Simple Factory) 1、模式: 簡(jiǎn)單工廠模式是類的創(chuàng)建模式,又叫做靜態(tài)工廠方法(Static Factory 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
14、 Fruit 11. private int treeAge /樹齡 12. 13. public void grow() 14. log("Apple is growing."); 15. 16. 17. 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 vo
15、id log(String msg) 27. System.out.println(msg); 28. 29. 30. public int getTreeAge() 31. return treeAge; 32. 33. 34. public void setTreeAge(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
16、. log("Grape is growing."); 45. 46. 47. public void harvest() 48. log("Grape has been harvested."); 49. 50. 51. public void plant() 52. log("Grape has been planted."); 53. 54. 55. public static void log(String msg) 56. System.out.println(msg); 57. 58. 59. /有無籽方法 60. pub
17、lic boolean getSeedless() 61. return seedless; 62. 63. 64. public void setSeedlees(boolean seedless) 65. this.seedless = seedless; 66. 67. 68. 69. /草莓類 70. public class Strawberry implements Fruit 71. public void grow() 72. log("Strawberry is growing."); 73. 74. 75. public void harvest() 7
18、6. 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(msg); 85. 86. 87. 88. /農(nóng)場(chǎng)園丁類,由他決定創(chuàng)建哪種水果類的實(shí)例 89. public class FruitGardener 90. /靜態(tài)工廠方法 91. publ
19、ic 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.equalslgnoreCase("strawberry") 97. return new Strawberry()
20、; 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 class Test 113. FruitGardener gardener =new F
21、ruitGardener(); 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("dont't has this fruit.")
22、; 121. 122. 123. 2、舉例:/水果接口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(&
23、quot;Apple has been planted.");/輔助方法public static void 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 grow
24、ing.");public void harvest()log("Grape has been harvested.");public 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 =
25、 seedless;/草莓類public class Strawberry implements Fruitpublic void grow()log("Strawberry is growing.");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(m
26、sg);/農(nóng)場(chǎng)園丁類,由他決定創(chuàng)建哪種水果類的實(shí)例public class FruitGardener/靜態(tài)工廠方法public static Fruit factory(String which) throws BadFruitExceptionif(which.equalslgnoreCase("apple")return new Apple();else if(which.equalslgnoreCase("grape")return new Grape();else if(which.equalslgnoreCase("strawber
27、ry")return new Strawberry();elsethrow new BadFruitException("Bad fruit request");/異常類public class BadFruitException extends Exceptionpublic BadFruitException(String msg)super(msg);/測(cè)試類public class TestFruitGardener gardener =new FruitGardener();trygardener.factory("grape");g
28、ardener.factory("apple");gardener.factory("strawberry");gardener.factory("banana");/拋出異常catch(BadFruitException e)System.out.println("dont't has this fruit.");3、三個(gè)角色: 1、工廠類(Creator)角色:在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對(duì)象 2、抽象產(chǎn)品角色:可以用一個(gè)接口或者一個(gè)抽象類實(shí)現(xiàn) 3、具體產(chǎn)品角色:工廠方法模式所創(chuàng)建的任何對(duì)象都是這個(gè)角色
29、的實(shí)例 4、如果工廠方法總是循環(huán)使用同一個(gè)產(chǎn)品對(duì)象,那么這個(gè)工廠對(duì)象可以使用一個(gè)屬性來存儲(chǔ)這個(gè)產(chǎn)品對(duì)象。 每一次客戶端調(diào)用工廠方法時(shí),工廠方法總是提供這同一個(gè)對(duì)象。 如果工廠方法永遠(yuǎn)循環(huán)使用固定數(shù)目的一些產(chǎn)品對(duì)象,而且這些產(chǎn)品對(duì)象的數(shù)目并不大的話, 可以使用一些私有屬性存儲(chǔ)對(duì)這些產(chǎn)品對(duì)象的引用。比如:一個(gè)永遠(yuǎn)只提供一個(gè)產(chǎn)品對(duì)象的工廠對(duì)象 可以使用一個(gè)靜態(tài)變量存儲(chǔ)對(duì)這個(gè)產(chǎn)品對(duì)象的引用。 如果工廠方法使用數(shù)目不確定,或者數(shù)目較大的一些產(chǎn)品對(duì)象的話,使用屬性變量存儲(chǔ)對(duì)這些產(chǎn)品對(duì)象的引用就不方便了, 這時(shí)候 就應(yīng)當(dāng)使用聚集對(duì)象存儲(chǔ)對(duì)產(chǎn)品對(duì)象的引用。 5、其他模式; 1、單例模式:?jiǎn)卫J揭髥卫惖臉?gòu)
30、造子是私有的,從而客戶端不能直接將之實(shí)例化,而必須通過這個(gè)靜態(tài)工廠方法將之實(shí)例化, 而且單例類自身是自己的工廠角色。單例類自己負(fù)責(zé)創(chuàng)建自身的實(shí)例 單例類使用一個(gè)靜態(tài)屬性存儲(chǔ)自己的唯一的實(shí)例,工廠方法永遠(yuǎn)僅提供這一個(gè)實(shí)例 2、多例模式:它是對(duì)單例模式的推廣,多例模式也禁止外界直接將之實(shí)例化,同時(shí)通過靜態(tài)工廠方法想外界提供循環(huán)使用的自身的實(shí)例, 多例模式可以有多個(gè)實(shí)例 多例模式具有一個(gè)聚集屬性,通過向這個(gè)聚集屬性登記已經(jīng)創(chuàng)建過的實(shí)例達(dá)到循環(huán)使用實(shí)例的目的, 它還擁有一個(gè)內(nèi)部狀態(tài),每一個(gè)內(nèi)部狀態(tài)都只有一個(gè)實(shí)例存在 根據(jù)外界傳入的參量,工廠方法可以查詢自己的登記聚集,如果具有這個(gè)狀態(tài)的實(shí)例已經(jīng)存在,
31、就直接將這個(gè)實(shí)例提供給外界:反之,就首先創(chuàng)建一個(gè)新的滿足要求的實(shí)例,將之登記到聚集中,然后再提供客戶端。 3、備忘錄模式:?jiǎn)卫J胶投嗬J绞褂靡粋€(gè)屬性或者聚集屬性來登記所創(chuàng)建的產(chǎn)品對(duì)象,一邊可以通過查詢這個(gè)屬性或者聚集屬性 找到并共享已經(jīng)創(chuàng)建了的產(chǎn)品對(duì)象,這就是備忘錄模式的應(yīng)用。 4、MVC模式:是更高層次上的架構(gòu)模式。 包括:合成模式、策略模式、觀察者模式、也有可能會(huì)包括裝飾模式、調(diào)停者模式、迭代子模式以及工廠方法模式等。 :如果系統(tǒng)需要有多個(gè)控制器參與這個(gè)過程的話,簡(jiǎn)單工廠模式就不適合了,應(yīng)當(dāng)考慮使用工廠方法模式。 6、簡(jiǎn)單工廠模式的優(yōu)點(diǎn)己缺點(diǎn) 優(yōu)點(diǎn):模式的核心是工廠類,這個(gè)類有必要的判
32、斷邏輯,可以決定在什么時(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è)類里面的另外一個(gè)缺點(diǎn)是,當(dāng)產(chǎn)品類有不同的接口種類時(shí),工廠需要判斷在什么時(shí)候創(chuàng)建某種產(chǎn)品, 這種對(duì)時(shí)機(jī)的判斷和對(duì)哪一種具體產(chǎn)品的判斷邏輯
33、混合在一起,使得系統(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)對(duì)于產(chǎn)品消費(fèi)者角色是成立的,而對(duì)于工廠角色是不成立的 一般而言:一個(gè)系統(tǒng)總是可以劃分成為產(chǎn)品的消費(fèi)者角色(Client)、產(chǎn)品的工廠角色(Factory)以及產(chǎn)品角色(Product)三個(gè)子系統(tǒng) 對(duì)于產(chǎn)品消費(fèi)者角色來
34、說,任何時(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ì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。 一般而言工廠方法模式的系統(tǒng)設(shè)計(jì)到以下幾種角色: 1) 抽象工廠(Creator)角色:擔(dān)任這個(gè)角色的是
35、工廠方法模式的核心,它是與應(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)的邏輯,并且受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。 3) 抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口, 在實(shí)際應(yīng)用中,這個(gè)角色也常常使用抽象java類實(shí)現(xiàn) 4) 具體產(chǎn)品角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所聲明的接口。工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)具體產(chǎn)品角色的實(shí)例 Java代碼
36、 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 Creator 15. /工廠方法 16. public Product factory() 17. return new Concre
37、teProduct1(); 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 30. public ConcreteProduct1() 31. /do somthing 32. 33. 34. 35. publ
38、ic 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. 46. public static void main(String args) 47. creator1 = new Concrete
39、Creator1(); 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è)沒有聲明任何方法的接口叫做標(biāo)識(shí)接口/具體工廠(角色)類public class ConcreteCreator1 implements C
40、reator/工廠方法public Product factory()return new ConcreteProduct1();public class ConcreteCreator2 implements Creator/工廠方法public Product factory()return new ConcreteProduct2();/具體產(chǎn)品(角色)類public class ConcreteProduct1 implements Productpublic ConcreteProduct1()/do somthingpublic class ConcreteProduct2 imp
41、lements 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 = creator1.factory();creator2 = new ConcreteCreator2();prod2 = creat
42、or2.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 interface FruitGardener 4. /工廠方法 5. public Fruit factory(); 6. 7. 8
43、. /具體工廠類(蘋果園?。?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() 18. return new Strawberry(); 19. 20. 21. 22. /.(葡萄園?。?23. public c
44、lass 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. 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 pla
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 外匯預(yù)收貨款合同范例
- 種牛租賃合同范例
- 鄉(xiāng)村居民個(gè)人借款合同范例
- 二手轉(zhuǎn)讓房屋買賣合同范例
- 正規(guī)送貨合同范例
- 聘請(qǐng)兼職律師合同范例
- 吹填砂合同范例
- 注冊(cè)地址合同范例
- 公司領(lǐng)導(dǎo)承攬工程合同范例
- 聘用司機(jī)勞務(wù)合同范例
- 2022-《參與感:小米口碑營(yíng)銷內(nèi)部手冊(cè)》
- 三級(jí)醫(yī)院醫(yī)療設(shè)備配置標(biāo)準(zhǔn)
- 合法離婚協(xié)議書(2篇)
- 水輪發(fā)電機(jī)組大修質(zhì)量標(biāo)準(zhǔn)
- 項(xiàng)目主要技術(shù)方案計(jì)劃表
- 汽車零部件開發(fā)質(zhì)量管理課件
- 20m29.6m30.4m20m鋼箱梁橋?qū)嵗O(shè)計(jì)內(nèi)容與表達(dá)
- 冀教版四年級(jí)上冊(cè)英語Unit 4單元測(cè)試卷(含聽力音頻)
- 【真題】北京市西城區(qū)六年級(jí)語文第一學(xué)期期末試卷 2021-2022學(xué)年(有答案)
- VMWare Horizon7平臺(tái)集成指南
- 口腔??谱o(hù)理知識(shí)考核試題與答案
評(píng)論
0/150
提交評(píng)論