前言
前一篇博文中介紹了簡單工廠模式,這裡再介紹一下工廠方法模式。與簡單工廠很像,那麼兩者的差別是什麼呢?在這篇博文中,首先會簡單介紹一下工廠方法的使用方法,并對工廠方法模式進行簡單的小結。最後,将結合具體的例子對比簡單工廠模式與工廠方法模式,并對兩者的使用場景做一個小小的歸納。
背景: 某公司開發了一個a軟體,資料庫使用的是sqlserver。後由于客戶要求需要使用oracle資料庫,原來的資料要遷移到oracle中,在遷移的過程中遇到很多問題,比如文法錯誤,關鍵字濫用,函數不支援等問題。請設計一組程式,實作資料的無縫遷移
問題背景與工廠方法一樣,主要是為了便于對兩者進行比較。ok,為了對工廠方法有一個更好的了解,請看下面的結構圖:
于是,我們根據上面的結構圖可以寫出如下的代碼:
測試結果:
<code>使用oracle添加使用者</code>
<code>使用oracle通過id找到使用者</code>
ok,通過上面的程式,我們來回顧一下工廠方法的定義:
工廠方法定義一個用于建立對象的接口,讓子類去決定執行個體化哪個對象。建立對象延遲到子類中
把建立對象延遲到子類中,由子類決定建立何種類型的執行個體
當需要增加功能時,隻需要直接修改用戶端而保持其他代碼不變就可以實作
回到上一篇博文中,假設有三個客戶需要使用oracle對象,那麼我們在代碼中這麼實作的:
好,這樣寫并沒有什麼問題,假如這三個使用者覺得oracle不好用,要改用sqlserver對象,怎麼辦?簡單,直接把上面的代碼中的oracle改為sqlserver不久行了嘛,是以修改之後的代碼這樣的:
代碼改好了,很簡單,有木有,确實。但是加入不是三個使用者而是一億個使用者呢?難道要改一億次,明顯不太現實(可能有人說,一億算個啥,用ctrl+h直接一替換不久完事了嗎。我們在讨論設計模式,不帶這麼玩的哈,這不科學!)
而我們使用工廠方法模式隻需要修改上面測試方法中的工廠對象就可以
通過這個例子,可以發現簡單工廠模式違背了<code>對外擴充開放,對内修改關閉的原則</code>,因為當需要增加mysql對象的時候,需要在工廠方法模式中添加switch的語句分支的判斷,而在工廠方法模式中,隻需要建立一個mysql對象工廠類(需要實作idbobjectfactory接口)就可以了,代碼比較簡單就不附上代碼了。