23種設計模式之工廠方法模式

工廠方法模式的定義

定義: 定義一個用於創建對象的接口,讓子類決定實例化哪一個類. 工廠方法使一個類的實例化延遲到其子類

工廠方法模式的通用類圖:

23種設計模式之工廠方法模式

其中 Product 負責產品的共性,實現對事物最抽象的定義; Creator 為抽象創建類, 也就是抽象工廠, 具體如何創建產品類是由具體的實現工廠 ConcreteCreator 完成的. 下面給出他們的代碼:

產品抽象類代碼:

23種設計模式之工廠方法模式

具體產品類繼承自抽象產品類,抽象工廠負責定義產品對象的產生,代碼如下;

23種設計模式之工廠方法模式

具體工廠類的實現代碼如下:

23種設計模式之工廠方法模式

工廠方法模式的優點

  1. 良好的封裝性,代碼結構清晰. 一個對象創建是有條件約束的, 如一個調用者需要一個具體的產品對象,只要知道產品的類名就可以了, 不用知道對象是如何創建的,降低模塊間的耦合
  2. 工廠方法模式的擴展性非常優秀. 在增加產品類的情況下, 只要適當的修改具體的工廠類或擴展一個工廠類, 就可以完成"擁抱變化".
  3. 屏蔽產品類. 產品類的實現如何變化,調用者都不需要關心,它只需要關心產品的接口, 只要接口保持不變, 系統中的上層模塊就不用發生變化. 因為產品類的實例化是由工廠類負責的,一個產品對象具體由哪一個產品生成是由工廠類決定的.
  4. 工廠方法模式是典型的解耦框架. 高層模塊只需要知道產品的抽象類, 其他的實現類都不用關心.

工廠方法模式的使用場景

  1. 工廠方法模式是new一個對象的替代品,所以在所有需要生成對象的地方都可以使用,但是要考慮是否要增加一個工廠類進行管理,增加代碼複雜度
  2. 需要靈活的、可擴展的框架時,可以考慮採用工廠方法模式.
  3. 工廠方法模式可以用在異構項目中,
  4. 可以使用在測試驅動開發的框架下. 例如, 測試一個類A,就需要把與類A有關聯關係的類B也同時生產出來,我們可以使用工廠方法模式把類B虛擬出來,避免類A與類B的耦合.

工廠方法模式的擴展

工廠方法模式有很多擴展,而且與其他模式結合使用威力更大,下面介紹四種擴展

1.縮小為簡單工廠模式

一個模塊僅需要一個工廠類,那就沒有必要把他產生出來,使用靜態方法就可以了,在使用的時候也就不用將類實例化, 直接使用即可. 調用者也比較簡單, 缺點是工廠類的擴展比較困難, 不符合開閉原則

2.升級為多個工廠類

當我們在做一個比較複雜的項目時,經常會遇到初始化一個對象很耗費精力的情況,所有的產品類都放到一個工廠方法中進行初始化會使代碼結構不清晰. 考慮到需要結構清晰, 我們為每個產品定義一個創造者, 好處是創建類的職責清晰,而且結構簡單, 但是給可擴展性和可維護性帶來了一定的影響. 當然, 在複雜的應用中一般採用多工廠的方法, 然後再增加一個協調類, 避免調用者與各個子工廠交流,協調類的作用是封裝子工廠類,對高層模塊提供統一的訪問接口.

3.替代單例模式

當類的構造方法為私有時, 可以通過反射來創建一個實例,然後通過工廠獲得該類的唯一實例

4.延遲初始化

就是一個對象被消費完畢後,並不立刻釋放,工廠類保持其初始狀態,等待再次被使用.

延遲加載框架是可以擴展的, 例如限制某一個產品類的最大實例化數量,可以通過判斷Map中已有的對象數量來實現,這樣的處理是非常有意義的.

延遲加載還可以用在對象初始化比較複雜的情況下,例如硬件訪問,設計多方面的交互,則可以通過延遲加載降低對象的產生和銷燬帶來的複雜性


工廠方法模式在項目中使用的非常頻繁,以至於很多代碼中都包含工廠方法模式. 而且工廠方法模式還可以與其它模式混合使用,變化出無窮的優秀設計,這也正是軟件設計和開發的樂趣所在.


分享到:


相關文章: