设计模式----工厂模式
一 簡單工廠模式
1.簡單工廠模式:屬于類的創建型模式,又叫靜態工程模式,通過一個專門的類來負責創建其他類的實例,被構建的類往往都有一個公共的父類或者父接口。
?
2.代碼實現略
3.從1的uml圖中可以分析出簡單工廠模式的優缺點
優點:
1)首先將產品的創建的邏輯放到了工廠中,從而避免了客戶端與具體的實現類直接的耦合,只是根據實現類的類型或者名稱來獲取實例。滿足里式替換原則。
2)隔離了客戶端沒有必要去了解具體產品的實現的細節。
缺點:
1)因為在工廠類中封裝了創建那種類的判斷邏輯 違背了單一職責的原則。如果增加其他產品的品種不得不修改工廠中的判斷的邏輯也就是要重新編譯改工廠類喪失了靈活性和可維護性。
2)一般靜態工廠,都是靜態的方法。因此無法發揮面向對象三大特性中,多態的動態分派。無法形成基于繼承的繼承樹的結構。
4.實際應用
以java中的jdbc來舉例說明,先看一下uml圖:
?
??JDBC是SUN公司提供的一套數據庫編程接口API,它利用Java語言提供簡單、一致的方式來訪問各種關系型數據庫。Java程序通過JDBC可以執行SQL語句,對獲取的數據進行處理,并將變化了的數據存回數據庫,因此,JDBC是Java應用程序與各種關系數據進行對話的一種機制。用JDBC進行數據庫訪問時,要使用數據庫廠商提供的驅動程序接口與數據庫管理系統進行數據交互。
客戶端要使用使用數據時,只需要和工廠進行交互即可,這就導致操作步驟得到極大的簡化,操作步驟按照順序依次為:注冊并加載數據庫驅動,一般使用Class.forName();創建與數據庫的鏈接Connection對象;創建SQL語句對象preparedStatement(sql);提交SQL語句,根據實際情況使用executeQuery()或者executeUpdate();顯示相應的結果;關閉數據庫。
注:即客戶端調用的時候,就沒有必要跟具體的數據庫耦合在一塊了
二、工廠方法模式
UML類圖如下:
?
? ? ? 這個和簡單工廠有區別,簡單工廠模式只有一個工廠,工廠方法模式對每一個產品都有相應的工廠
好處:增加一個運算類(例如N次方類),只需要增加運算類和相對應的工廠,兩個類,不需要修改工廠類。
缺點:增加運算類,會修改客戶端代碼,工廠方法只是把簡單工廠的內部邏輯判斷移到了客戶端進行。
?
三?抽象工廠模式:參考大話設計模式
UML類圖如下:
? ??從圖上可以看出這和工廠方法模式很相似,但是呢,有幾個區別:
抽象工廠模式,一個具體工廠可以制造幾個產品,例如微軟工廠(相當于SqlserverFactory)可以制造微軟鼠標(屬于鼠標類,鼠標類下面有惠普鼠標,微軟鼠標等,相當于上圖中的IDepartment下面的SqlserverDepartment和AccessDepartment),也可以制造微軟鍵盤(屬于鍵盤類,鍵盤類下面有惠普鍵盤,微軟鍵盤等,相當于上圖中的IUser下面的SqlserverUser和AccessUser)。
參考網上http://blog.csdn.net/wangwenhui11/article/details/3955125中的話:
????????????工廠方法模式:一個抽象產品類,可以派生出多個具體產品類。?
????????????????????????????????一個抽象工廠類,可以派生出多個具體工廠類。?
????????????????????每個具體工廠類只能創建一個具體產品類的實例。?
????????抽象工廠模式:多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。?
????????????????????????????一個抽象工廠類,可以派生出多個具體工廠類。?
????????????????????????????每個具體工廠類可以創建多個具體產品類的實例。?
????????????區別:工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
? ? ? ??????工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
?? ? 抽像工廠優缺:
? ? ??優點:易于交換產品系列,例如Access和SQLServer數據庫之間切換。
缺點:例如增加一個機箱產品,不僅需要添加三個類“機箱類,微軟機箱,惠普機箱”,還要修改惠普工廠,微軟工廠支持制造機箱。而添加一個聯想工廠的時候,只需要添加三個類,使用聯想工廠還是要修改客戶端代碼的。
在《大話設計模式》中,提出用簡單工廠模式改進抽象工廠模式的方法。
DataAccess的代碼如下:
這樣,在DataAccess里面直接指定數據庫(指定品牌),當需要換數據庫(or 品牌)的時候,修改DataAccess內的代碼。
當然可以用反射方法修改數據庫,這樣,只需要修改配置文件。就完美的改善了抽象工廠的缺點,而且在客戶端不用修改代碼。
反射實現:
要修改db屬性:
?這里面用的就是利用反射來去除了switch或if解除分支帶來的耦合。
轉載于:https://www.cnblogs.com/prctice/p/5803242.html
總結
以上是生活随笔為你收集整理的设计模式----工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模拟】Codeforces 705A
- 下一篇: maven选包算法(两个相同的包)