什麼是工廠模式
工廠模式在其父類提供一個建立對象的方法,讓其子類去實作具體傳回那個對象
UML圖
工廠方法模式
抽象工廠模式
兩者的對比
從上述的UML圖中我們可以看出,工廠方法模式隻定義了一種産品繼承關系,而抽象工廠可以定義多種産品繼承關系。可以很優美的完成工廠的擴建,而産品的擴建則不滿足開閉原則。工廠方法模式可以很好的滿足工廠和商品的擴建,但在工廠和商品很多的情況下,未免顯得很龐雜。
以下内容來自此網站
工廠模式使用場景
- 當你在編寫代碼的過程中, 如果無法預知對象确切類别及其依賴關系時, 可使用工廠方法。
- 工廠方法将建立産品的代碼與實際使用産品的代碼分離, 進而能在不影響其他代碼的情況下擴充産品建立部分代碼。例如, 如果需要向應用中添加一種新産品, 你隻需要開發新的建立者子類, 然後重寫其工廠方法即可。
- 如果你希望使用者能擴充你軟體庫或架構的内部元件, 可使用工廠方法。
- 繼承可能是擴充軟體庫或架構預設行為的最簡單方法。 但是當你使用子類 替代标準元件時, 架構如何辨識出該子類?
- 解決方案是将各架構中構造元件的代碼集中到單個工廠方法中, 并在繼承該元件之外允許任何人對該方法進行重寫。
- 讓我們看看具體是如何實作的。 假設你使用開源 UI 架構編寫自己的應用。 你希望在應用中使用圓形按鈕, 但是原架構僅支援矩形按鈕。 你可以使用 圓形按鈕RoundButton子類來繼承标準的 按鈕Button類。 但是, 你需要告訴 UI架構UIFramework類使用新的子類按鈕代替預設按鈕。
- 為了實作這個功能, 你可以根據基礎架構類開發子類 圓形按鈕 UIUIWithRoundButtons , 并且重寫其 createButton建立按鈕方法。 基類中的該方法傳回 按鈕對象, 而你開發的子類傳回 圓形按鈕對象。 現在, 你就可以使用 圓形按鈕 UI類代替 UI架構類。 就是這麼簡單!
- 如果你希望複用現有對象來節省系統資源, 而不是每次都重新建立對象, 可使用工廠方法。
- 在處理大型資源密集型對象 (比如資料庫連接配接、 檔案系統和網絡資源) 時, 你會經常碰到這種資源需求。
- 讓我們思考複用現有對象的方法:
-
首先, 你需要建立存儲空間來存放所有已經建立的對象。
當他人請求一個對象時, 程式将在對象池中搜尋可用對象。
… 然後将其傳回給用戶端代碼。
如果沒有可用對象, 程式則建立一個新對象 (并将其添加到對象池中)。這些代碼可不少! 而且它們必須位于同一處, 這樣才能確定重複代碼不會污染程式。
- 可能最顯而易見, 也是最友善的方式, 就是将這些代碼放置在我們試圖重用的對象類的構造函數中。 但是從定義上來講, 構造函數始終傳回的是新對象, 其無法傳回現有執行個體。
- 是以, 你需要有一個既能夠建立新對象, 又可以重用現有對象的普通方法。 這聽上去和工廠方法非常相像。
- 如果代碼需要與多個不同系列的相關産品互動, 但是由于無法提前擷取相關資訊, 或者出于對未來擴充性的考慮, 你不希望代碼基于産品的具體類進行建構, 在這種情況下, 你可以使用抽象工廠。
- 抽象工廠為你提供了一個接口, 可用于建立每個系列産品的對象。 隻要代碼通過該接口建立對象, 那麼你就不會生成與應用程式已生成的産品類型不一緻的産品。
與其他設計模式的關系
- 在許多設計工作的初期都會使用工廠方法模式 (較為簡單, 而且可以更友善地通過子類進行定制), 随後演化為使用抽象工廠模式、 原型模式或建造者模式 (更靈活但更加複雜)。
- 建造者重點關注如何分步生成複雜對象。 抽象工廠專門用于生産一系列相關對象。 抽象工廠會馬上傳回産品, 建造者模式則允許你在擷取産品前執行一些額外構造步驟。