工廠方法模式

2021-10-01 08:49:15 字數 1759 閱讀 9059

工廠方法模式,定義乙個介面用於建立物件的介面,讓這個介面的子類決定例項化哪乙個類。

定義乙個介面,用於建立物件。這個用於建立物件的介面,就是工廠介面abstractfactory,介面定義了乙個方法,用於返回乙個類的例項

讓這個介面的子類決定例項化哪乙個類的例項。工廠介面的子類factory,實現工廠介面的方法,這個方法呼叫某乙個類的構造方法(對於更複雜的情況,不僅僅是用new呼叫建構函式那麼簡單,可能還會有其他的處理邏輯),然後將例項化好的物件返回。

子類決定例項化哪個類,說明工廠會返回多個類的例項,至於返回哪乙個,根據傳入的引數來確定

可以看到,我們建立乙個圓形的物件時,僅僅通過乙個字串進行約束,工廠便根據約束字串決定,建立了乙個物件,我們甚至不知道這個圓形物件具體的類。

大體上把工廠方法模式簡單的介紹了一下,接下來就說說工廠方法模式在什麼時候使用。

乙個類不知道它所需要的物件的類:就像上面的例子,對於場景類client來說,shape的子類circle是沒必要被知道的,只要知道建立circle類的例項的工廠方法就可以建立這個例項。

將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無需關心是哪乙個工廠子類建立產品子類,需要時再動態指定。(可以將具體工廠的類名儲存在配置檔案或資料庫中)

需要靈活的、可擴充套件的框架時,可以使用工廠方法模式。就拿熟悉的jdbc來舉例子,其中有乙個方法drivermanager.getconnection(string url),這就是乙個工廠模式,傳入不同的url,這個「連線工廠」就會返回不同版本資料庫的連線,同樣,不必要指導這個「連線產品」是哪乙個類的例項。

良好的封裝性,**結構清晰。乙個物件的建立有條件約束,當建立乙個物件時,僅需要指導「約束字串」(就像jdbc中,資料庫的url就是約束字串)或類名(有時候甚至不需要知道類名,在下面的「遮蔽產品類」中介紹)就可以建立乙個物件,不必要知道建立這個物件的細節,降低了耦合。

擴充套件性非常優秀。如果增加了新的產品,只需要新建乙個具體的產品類和乙個具體的工廠類即可,對原來的**沒有修改或少量修改。(當然,這也會有新的問題,在下面的缺點中再介紹)

遮蔽產品類。這一點比較重要,產品類的實現如何變化,呼叫者不需要關心,只需要保證介面不發生變化,系統的上層模組就不需要變化。還拿jdbc舉例子,如果系統更換資料庫,只需要修改「約束字串」,也就是驅動的名稱即可。

工廠方法是典型的解耦框架。上層模組僅需要知道產品的抽象類(介面),其他的都不需要關心,符合迪公尺特法則,不需要的就不去交流;也符合依賴倒置原則,只依賴產品類的抽象;也符合黎克特制替換原則,產品的子類可以替代產品的父類。

在優點中說過,擴充套件時只需要新增兩個類即可。在一定程度上增加了複雜度。

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...

工廠方法模式(一) 簡單工廠方法模式

ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...