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