老生常谈:工厂模式兄弟姐妹
???? 下面用一個實例來說明工廠模式.
???? 案例:一個視頻網站,其中的一個列表頁中有個分類導航,需要按類型來查詢出相應的視頻.這里就定義為:體育,娛樂。取視頻并不是簡單的依靠類似分類表這樣查詢,可能查詢的方法迥然不同。為了使這個模塊具有可擴展性,我在這分別應用工廠模式來設計,看下他們的好處。
???? 工廠模式在設計模式中可謂是個大牌了,應用十分廣泛.它一般包含三種方式:
???? 1:簡單工廠模式:專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。它又稱為靜態工廠方法模式,屬于類的創建型模式。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
?????? 簡單工廠模式的UML類圖
???? 簡單工廠模式實例:
????????? 1:統一的接口IManageList,申明一個取視頻信息的方法。
?????????
??????????{
???????????????DataTable?getInformationList();
??????????}
?????????
???????? 2:體育視頻類。 ??????
??????????{
???????????????DataTable?getInformationList()
???????????????{//具體方法省略;}
??????????}
?????????
?????????? 3:娛樂視頻類。????????
??????????{
???????????????DataTable?getInformationList()
???????????????{//具體方法省略;}
??????????}
?????????
???????? 4:工廠類。???????
??????????{
?????????????????public?static?IManageList?createInstance(string?stype)
??????????????????{
??????????????????????IManageList?list=null;
??????????????????????if(stype=="體育")
??????????????????????{list=new?sportsList();}
??????????????????????
??????????????????????return?list;
??????????????????}
??????????}
????????????
??????????? 5:client:???????????
?????????????DataTable?dr=list.getInformationList();
????????????????????
???? 2:工廠方法:工廠方法模式的思想:使一個類的實例化延遲到子類。定義一個用于創建對象的工廠類,由其決定實例化同一抽象類派生出來的具體類。此模式主要包括三個角色:工廠類,抽象類(接口),具體類。
???????????
???????? 工廠方法類圖:
??????????????
????????????? 工廠方法實例:?
????????????? 1:統一的接口IManageList,申明一個取視頻信息的方法。
??????????????
??????????????{
??????????????????DataTable?getInformationList();
??????????????}
?????????????? 2:工廠基類。
??????????????
???????????????{
?????????????????????public?abstract?IManageList?createInstance(string?stype);
???????????????}
??????????????
????????????? 3:具體工廠類。?????????????
???????????????{
????????????????????public?override?IManageList?createInstance(string?stype)
????????????????????{//具體代碼省略}
???????????????}
??????????????
???????????? 4:client:??????????
?????????????IManageList?list=f.createInstance("體育");
?????????????DataTable?dr=list.getInformationList();
???? 3:抽象工廠
??????????? 工廠方法的使用者可能會面臨兩種情況:第一種情況是對于某個產品,我清楚地知道應該使用哪個具體工廠為我服務,于是,我實例化該具體工廠,生產出具體的產品來。第二種情況,我只是需要一種產品,而不想知道也不需要知道究竟是哪個工廠為我生產的,即最終選用哪個具體工廠的決定權在生產者一方,它們根據當前系統的情況來實例化一個具體的工廠返回給使用者,而這個決策過程這對于使用者來說是透明的。
????????? 兩種情況下具體的實現是不一樣的,對于第一種情況,很可能是產品和生產者(工廠)各有一個公共接口,然后不同的具體工廠生產出對應不同的產品,二者出現平行的類結構。第二種情況各個具體生成者的共同父類通過方法的形式對外提供一個接口,返回哪個具體工廠實例的判斷邏輯在該方法中實現,使用者通過調用該方法得到具體的工廠實例。
????????? 抽象工廠類圖:
??????????????
??????????
????????????????
????? 抽象工廠一般通過工廠方法來實現(還可以通過原型來構造),如果將工廠方法比作一個獨立的小廠房,那么抽象工廠就是一個大集團了,在它旗下,集合了很多工廠,雖然生成不同的產品,但是都有該集團的徽號。譬如說,雖然lenovo的鼠標鍵盤是羅技的,顯示器是philips做的,但是都打上了聯想的標志。我們買了一套聯想的PC,就整套都帶有聯想的風格,這跟Dell是不一樣的。我們平時所說的“look and feel”也就這個道理。你相要哪種風格,就看你選的是哪個集團了。
????? 抽象工廠實例:我們如果擴展一下上面取視頻信息的過程,把這部分模塊化。如果不是取視頻信息而是讀取新聞呢,這樣工廠方法就不合適了,我們可以定義一個工廠超類來管理他們的子工廠類,提供統一的接口,這樣就可以擴展系統功能了。
?????? 總結:這三種實現方式各有各的好處。從類圖上面來看,根據我介紹的順序來看,他們越來越復雜,可見他們的功能也是越來越強大。擴展性一個比一個強,解藕能力也是長江后浪推前浪。我們可以像用.net中的服務器綁定控件(Reapeter,DataList,GridView)一樣來應用工廠模式,不選最復雜的,只選最適合自己的。
???????本人對于模式只屬于學習階段,如果有什么地方說錯了,還忘大家指教。:)
????????
???? 注:本文參考以下文章:
????????? http://hi.baidu.com/daping_zhang/blog/item/bd85d4397a1437f33a87ce0f.html
轉載于:https://www.cnblogs.com/ASPNET2008/archive/2008/05/21/1203996.html
總結
以上是生活随笔為你收集整理的老生常谈:工厂模式兄弟姐妹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻击恶意软件--清除和保护你的网站的小技
- 下一篇: Frame和Iframe横向滚动条的解决