前言
oop開發有個原則是針對抽象程式設計而不是針對具體程式設計,實際的軟體開發中,因為時間和專案進度等客觀不可抵抗和主觀的因素,我們偏向使用最簡單的的方式去實現功能,而沒有考慮到未來可能會有的擴充套件問題,導致未來發生擴充套件的時候出現了維護性的災難,軟體模組不好擴充套件,需求變動就得修改模組,這就違反了開閉原則,所以,很有必要在設計的時候去考慮未來可能會引入的變化,使用合適的模式去應對未來的這種變化。
簡單工廠
簡單工廠作為工廠模式的最簡單的一種,與其說是一種模式,不如說是一種程式設計習慣,軟體開發中,我們會無意識或者有意思的把經常用到的那部分內容抽取到乙個模組中統一建立,而不是在多個使用者單獨的建立,這也遵循軟體開發中的don't repeat yourself原則,一般的我們會把建立的方法定義為靜態的方法,如果內容有差異,一般滴我們會使用型別進行區分,比如下面**,我們建立不同型別的mapview物件,這是乙個典型的簡單工廠的例子。
簡單工廠的侷限
定義乙個靜態方法+ (uiview*)mapviewwithframe:(cgrect)frame type:(maptype)maptype
,實現中使用分支語句建立不同的例項,如果後面有其他型別的例項,那麼這個方法就得進行相應的修改,如果型別變得多了,建立的過程複雜了,這個模組就得經常的修改,這還沒什麼,簡單工廠返回的是乙個uiview的通用型別,使用者需要強轉為對應的型別,才能充分的使用到這個uiview物件,在這個場景中mamapview
和bmkmapview
這兩個類的介面是完全不同的,這意味著,新增了乙個新型別,修改的不僅僅是工廠靜態方法,呼叫者的使用方式也必須進行相應的修改,違法了開閉原則,讓維護和擴充套件變得困難起來了,這不是我們想要的。
工廠方法
工廠方法是對簡單工廠的抽象,讓工廠具有了良好的擴充套件性,使得容易擴充套件和維護,工廠方法抽象了兩個方面,首先對產品進行了抽象,在上面的案例中就是對mapview進行了抽象,在抽象了mapview中定義公共的介面提供給呼叫者使用;其次對工廠進行了抽象,工廠返回的不是乙個具體的mapview,而是抽象之後的mapview,呼叫者可以使用抽象的mapview種定義的公共的介面和具體的mapview物件互動。
工廠方法的uml描述如下:
工廠方法**實現
上面的**片段就是乙個簡單的工廠方法的例子,抽象的產品只提供了乙個介面,真是的場景使用到的不止乙個公有介面,因需求而定。
當需求有變化需要替換底層元件,呼叫者只要修改工廠就行了,需要新增相應的具體產品和具體的工廠就行了,不會依賴於具體的實現,擴充套件起來相當的方便,當然,因為抽象級別的提高,**量也會相應的變多,不過這是必要的犧牲,魚和熊掌不可兼得。
抽象工廠
工廠方法返回的是多個同種型別的物件,未來的擴充套件我們可能會遇到返回的是一組同種型別的物件,比如在我們的軟體場景中,我麼未來可能擴充套件我們的工廠返回定位物件,這種場景,需要定義乙個定位物件的協議,工廠協議需要新增乙個公共介面返回乙個定位物件,這樣工廠方法轉換為了抽象工廠,可以這麼說抽象工廠是對工廠方法的再次抽象和擴充套件。
抽象工廠的uml描述如下:
抽象工廠**實現
抽象工廠在工廠方法的基礎上進行了擴充套件,新增了兩部分:1、新增了乙個location抽象介面和location對應的實現;2、工廠的介面新增了乙個返回location物件的公有方法。下面**只展示了新增加的部分,完整的**可以檢視文章底部的鏈結。
使用方法:
總結
工廠模式在實際軟體開發中使用的場景是很多的,如果在可預見的未來軟體會很有可能發生擴充套件變化,那麼引入工廠方法或者抽象工廠設計出良好擴充套件的模組還是很有必要的,如果這個模組相對固定不容易改變,那麼使用工廠方法也沒什麼問題,畢竟簡單高效才是王道,引入模式反而把問題複雜化了,維護起來工作量反而大了,一點個人不成熟的想法,以上。
相關鏈結
本文demo原始碼傳送門》
物件導向的程式設計之工廠模式
工廠模式是軟體工程領域一種廣為人知的設計模式,這種模式抽象了建立具體物件的過程。考慮到在ecmascript中無法建立類,開發人員就發明了一種函式,用函式來封裝以特定介面建立物件的細節,如下面的例子所示。1 function createperson name,age,job 9return o 1...
面向介面程式設計 工廠模式 單例模式
當與資料庫打交道,考慮到有各種各樣的資料庫,我們通常設計乙個dao介面與n個dao類,dao類實現dao介面,在處理類中定義乙個dao介面,並在配置檔案中設定這個介面使用的是哪個dao類。此種方法也叫控制反轉。當有好多介面時如userdao,categorydao,productdao時,我們通常設...
面向介面程式設計 工廠模式 單例模式
當與資料庫打交道,考慮到有各種各樣的資料庫,我們通常設計乙個dao介面與n個dao類,dao類實現dao介面,在處理類中定義乙個dao介面,並在配置檔案中設定這個介面使用的是哪個dao類。此種方法也叫控制反轉。當有好多介面時如userdao,categorydao,productdao時,我們通常設...