摘要:工廠方法模式和策略的模式有什么區(qū)別區(qū)別在于,策略模式強調(diào)的是提供不同的策略方案,而工廠方法模式強調(diào)的是產(chǎn)品本身。
女朋友dodo鬧脾氣,氣勢洶洶的說“我要吃雪糕”。筆者心里啊樂滋滋的,一支雪糕就能哄回來,不亦樂乎?!
但是,雪糕買回來了,她竟然說“不想吃雪糕了,突然想吃披薩”。呵呵了,憋了一股勁“沒問題”,又屁顛屁顛的去把披薩買回來。
世事難料,dodo同學又放大招了,“披薩太上火了,我要吃芝士蛋糕”。
這時候,工廠方法模式該上場了,使用它可以完美的解決不斷的產(chǎn)品變更。工廠方法模式是怎么樣的?而工廠模式又是怎樣解決產(chǎn)品變更呢?一起來看看...
一、工廠方法模式 定義??定義一個創(chuàng)建對象的工廠接口,工廠方法將實例化推遲到子類中。
定義總是抽象的,先放出工廠方法模式的UML圖如下所示:
從上圖可以看出,工廠方法模式涉及到以下四個角色的概念:
??- 抽象工廠角色:工廠方法模式的核心,創(chuàng)建產(chǎn)品的工廠類必須實現(xiàn)該接口。
??- 具體工廠角色:該角色實現(xiàn)了抽象工廠接口,具體如何創(chuàng)建產(chǎn)品類就是在該實現(xiàn)類完成。
??- 抽象產(chǎn)品角色:所有產(chǎn)品類的超類,負責實現(xiàn)產(chǎn)品共性的抽象定義。
??- 具體產(chǎn)品角色:該角色實現(xiàn)了抽象產(chǎn)品接口,負責具體的不同產(chǎn)品業(yè)務(wù)邏輯。
二、實戰(zhàn) 上代碼抽象工廠角色代碼如下:
public interface Factory { // 傳入?yún)?shù)的是產(chǎn)品類型,這里返回產(chǎn)品類的抽象工廠類Product public Product factory(String productType); }
這里做出生產(chǎn)雪糕、披薩的工廠,有了工廠才能生產(chǎn)對應的產(chǎn)品,具體工廠角色代碼如下:
// 雪糕的工廠,負責生產(chǎn)雪糕 public class IceCreamFactory implements Factory { @Override public Product factory() { return new IceCream(); } }
上面看到抽象角色Product,看代碼:
public interface Product { public void product(); }
具體角色代碼如下:
public class IceCream implements Product { @Override public void product() { /** * 具體的業(yè)務(wù)邏輯 */ System.out.println("雪糕做好了??!"); } }
OK,涉及到工廠方式模式系統(tǒng)的代碼基本完成,下面看看客戶端怎么使用工廠模式,雪糕準備就緒:
public class Client { public static void main(String[] args){ // 生產(chǎn)雪糕 Factory iceCreamFactory = new IceCreamFactory(); Product iceCream = iceCreamFactory.factory(); iceCream.product(); } }
運行客戶端代碼,結(jié)果如下:
雪糕做好了!!擴展
雪糕的order已經(jīng)完成!雪糕不吃,吃披薩?OK,現(xiàn)在就做披薩。同樣的先實現(xiàn)抽象工廠和抽象產(chǎn)品角色。
披薩工廠實現(xiàn)如下:
// 披薩的工廠,負責生產(chǎn)披薩 public class PizzaFactory implements Factory { @Override public Product factory() { return new Pizza(); } }
接下來就是披薩:
public class Pizza implements Product { @Override public void product() { /** * 具體的業(yè)務(wù)邏輯 */ System.out.println("披薩做好了?。?); } }
現(xiàn)在我們在客戶端中實現(xiàn)生產(chǎn)披薩,代碼如下:
public class Client { public static void main(String[] args){ // 生產(chǎn)雪糕 Factory iceCreamFactory = new IceCreamFactory(); Product iceCream = iceCreamFactory.factory(); iceCream.product(); // 生產(chǎn)披薩 Factory pizzaFactory = new PizzaFactory(); Product pizza = pizzaFactory.factory(); pizza.product(); } }
運行結(jié)果如下:
雪糕做好了!!三、工廠方法模式的優(yōu)缺點 優(yōu)點披薩做好了!!
1)優(yōu)秀的擴展性。假如披薩不想吃了,想吃芝士蛋糕,只需要增加芝士蛋糕的具體工廠和具體產(chǎn)品類,不會影響其他產(chǎn)品的生產(chǎn)。
2)大降低代碼的耦合度,客戶端最終得到的是產(chǎn)品本身,而不需要知道和操作產(chǎn)品的生產(chǎn)過程。
缺點1)增加新產(chǎn)品時,需要增加具體的工廠類和具體的產(chǎn)品類,當產(chǎn)品數(shù)量多的時候就會造成系統(tǒng)的復雜度增大,也增加了對系統(tǒng)理解的難度。
四、比較跟策略模式對比:問得最多的一個問題。工廠方法模式和策略的模式有什么區(qū)別?區(qū)別在于,策略模式強調(diào)的是提供不同的策略方案,而工廠方法模式強調(diào)的是產(chǎn)品本身。
策略模式接下來也會說到,把策略模式吃透了,回頭再跟工廠方法模式對比的時候就恍然大悟了。
總結(jié)首先,上一篇的單例模式很多人都給我提了很不錯的建議,也在這篇文章中改進了。工廠方式模式的使用率也非常高,掌握它對把握系統(tǒng)架構(gòu)會有比較大的提升。下一篇要分享的是:建造者模式
設(shè)計模式Java源碼GitHub下載:https://github.com/jetLee92/DesignPattern
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/67900.html
摘要:孫臏心里一萬個草泥馬在奔騰,差點沒噎死自己滾一邊去,我們這盤跟他賽馬開始,策略模式上場。在設(shè)計模式之禪中的提出通過策略枚舉和反射機制對策略模式進行改良,膜拜了但是要添加或淘汰策略,還是得去對枚舉進行修改,也不符合開閉原則。 今天給大家說說田忌賽馬的故事。如有雷同,純屬巧合!話說在戰(zhàn)國時期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂活動的,其中賽馬是最火爆的。一天,孫臏看到田忌像個死雞似...
摘要:我認為按書上的順序比較好理解因為簡單靜態(tài)工廠模式是在工廠方法模式上縮減,抽象工廠模式是在工廠方法模式上再增強。所以我就先講工廠方法模式了。抽象工廠模式抽象工廠模式就比較復雜了,我們一般的應用都寫不到。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 昨天寫了單例模式了,今天是時候?qū)懝S模式啦~ 工廠模式我個人認為其實比...
摘要:汽車本身就是復雜產(chǎn)品對象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構(gòu)造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優(yōu)缺點優(yōu)點降低代碼耦合度。 在未上大學之前,一直有個夢想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設(shè)計的汽車飛奔在公路上,迷倒了萬千少女??瓤葉~雖然現(xiàn)在沒實現(xiàn)我的dream,但夢想還是得有的。 說到...
閱讀 3211·2021-09-22 14:59
閱讀 2014·2021-09-22 10:02
閱讀 2182·2021-09-04 16:48
閱讀 2325·2019-08-30 15:53
閱讀 3040·2019-08-30 11:27
閱讀 3510·2019-08-29 18:35
閱讀 1019·2019-08-29 17:07
閱讀 2733·2019-08-29 13:27