【Java设计模式】工厂模式
分工越細,項目就更容易拓展
工廠模式實現(xiàn)了創(chuàng)建者和調(diào)用者分離。
設(shè)計模式是一種思想,學(xué)習(xí)設(shè)計模式可以提高你的思考角度。
面向?qū)ο笤O(shè)計的基本原則:
OCP(開閉原則,Open-Closed Principle):一個軟件的實體應(yīng)當對擴展開放,對修改關(guān)閉。
DIP(依賴倒轉(zhuǎn)原則,Dependence Inversion Principle):要針對接口編程,不要針對實現(xiàn)編程。
LoD(迪米特法則,Law of Demeter):只與你直接的朋友通信,而避免和陌生人通信。類盡量少地以來其他類,實現(xiàn)類與類之間的解耦。利于擴展。
不使用簡單工廠的情況
簡單工廠模式
方法工廠模式
工廠方法模式要點:
– 為了避免簡單工廠模式的缺點,不完全滿足OCP。
– 工廠方法模式和簡單工廠模式最大的不同在于,簡單工廠模式只有一個(對于一個項目
或者一個獨立模塊而言)工廠類,而工廠方法模式有一組實現(xiàn)了相同接口的工廠類。
實際項目中,還是簡單工廠用的比較多
簡單工廠模式和工廠方法模式PK:
– 結(jié)構(gòu)復(fù)雜度
從這個角度比較,顯然簡單工廠模式要占優(yōu)。簡單工廠模式只需一個工廠類,而工廠方法模式的工廠類隨著產(chǎn)品類個數(shù)增加而增加,這無疑會使類的個數(shù)越來越多,從而增加了結(jié)構(gòu)的復(fù)雜程度。
– 代碼復(fù)雜度
代碼復(fù)雜度和結(jié)構(gòu)復(fù)雜度是一對矛盾,既然簡單工廠模式在結(jié)構(gòu)方面相對簡潔,那么它在代碼方面肯定是比工廠方法模式復(fù)雜的了。簡單工廠模式的工廠類隨著產(chǎn)品類的增加需要增加很多方法(或代碼),而工廠方法模式每個具體工廠類只完成單一任務(wù),代碼簡潔。
– 客戶端編程難度
工廠方法模式雖然在工廠類結(jié)構(gòu)中引入了接口從而滿足了OCP,但是在客戶端編碼中需要對工廠類進行實例化。而簡單工廠模式的工廠類是個靜態(tài)類,在客戶端無需實例化,這無疑是個吸引人的優(yōu)點。
– 管理上的難度
這是個關(guān)鍵的問題。
我們先談擴展。眾所周知,工廠方法模式完全滿足OCP,即它有非常良好的擴展性。那是否就說明了簡單工廠模式就沒有擴展性呢?答案是否定的。簡單工廠模式同樣具備良好的擴展性——擴展的時候僅需要修改少量的代碼(修改工廠類的代碼)就可以滿足擴展性的要求了。盡管這沒有完全滿足OCP,但我們不需要太拘泥于設(shè)計理論,要知道,sun提供的java官方工具包中也有想到多沒有滿足OCP的例子啊。
然后我們從維護性的角度分析下。假如某個具體產(chǎn)品類需要進行一定的修改,很可能需要修改對應(yīng)的工廠類。當同時需要修改多個產(chǎn)品類的時候,對工廠類的修改會變得相當麻煩(對號入座已經(jīng)是個問題了)。反而簡單工廠沒有這些麻煩,當多個產(chǎn)品類需要修改是,簡單工廠模式仍然僅僅需要修改唯一的工廠類(無論怎樣都能改到滿足要求吧?大不了把這個類重寫)。
? 根據(jù)設(shè)計理論建議:工廠方法模式。但實際上,我們一般都用簡單工廠模式。
抽象工廠模式
– 用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。(對于增加新的產(chǎn)品,無能為力;
支持增加產(chǎn)品族)
– 抽象工廠模式是工廠方法模式的升級版本,在有多個業(yè)務(wù)品種、業(yè)務(wù)
分類時,通過抽象工廠模式產(chǎn)生需要的對象是一種非常好的解決方式。
總結(jié)
工廠模式要點:
– 簡單工廠模式(靜態(tài)工廠模式)
? 雖然某種程度不符合設(shè)計原則,但實際使用最多。
– 工廠方法模式
? 不修改已有類的前提下,通過增加新的工廠類實現(xiàn)擴展。
– 抽象工廠模式
? 不可以增加產(chǎn)品,可以增加產(chǎn)品族!
? 應(yīng)用場景
– JDK中Calendar的getInstance方法
– JDBC中Connection對象的獲取
– Hibernate中SessionFactory創(chuàng)建Session
– spring中IOC容器創(chuàng)建管理bean對象
– XML解析時的DocumentBuilderFactory創(chuàng)建解析器對象
– 反射中Class對象的newInstance()
– servlet:工廠模式+單例模式
總結(jié)
以上是生活随笔為你收集整理的【Java设计模式】工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java设计模式】GOF32 - 单例
- 下一篇: 【Java设计模式】建造者模式、原型模式