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

2021-09-22 02:11:38 字數 1894 閱讀 6670

定義: 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類. 工廠方法使乙個類的例項化延遲到其子類

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

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

產品抽象類**:

具體產品類繼承自抽象產品類,抽象工廠負責定義產品物件的產生,**如下;

具體工廠類的實現**如下:

良好的封裝性,**結構清晰. 乙個物件建立是有條件約束的, 如乙個呼叫者需要乙個具體的產品物件,只要知道產品的類名就可以了, 不用知道物件是如何建立的,降低模組間的耦合

工廠方法模式的擴充套件性非常優秀. 在增加產品類的情況下, 只要適當的修改具體的工廠類或擴充套件乙個工廠類, 就可以完成"擁抱變化".

遮蔽產品類. 產品類的實現如何變化,呼叫者都不需要關心,它只需要關心產品的介面, 只要介面保持不變, 系統中的上層模組就不用發生變化. 因為產品類的例項化是由工廠類負責的,乙個產品物件具體由哪乙個產品生成是由工廠類決定的.

工廠方法模式是典型的解耦框架. 高層模組只需要知道產品的抽象類, 其他的實現類都不用關心.

工廠方法模式是new乙個物件的替代品,所以在所有需要生成物件的地方都可以使用,但是要考慮是否要增加乙個工廠類進行管理,增加**複雜度

需要靈活的、可擴充套件的框架時,可以考慮採用工廠方法模式.

工廠方法模式可以用在異構專案中,

可以使用在測試驅動開發的框架下. 例如, 測試乙個類a,就需要把與類a有關聯關係的類b也同時生產出來,我們可以使用工廠方法模式把類b虛擬出來,避免類a與類b的耦合.

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

1.縮小為簡單工廠模式

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

2.公升級為多個工廠類

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

3.替代單例模式

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

4.延遲初始化

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

延遲載入框架是可以擴充套件的, 例如限制某乙個產品類的最大例項化數量,可以通過判斷map中已有的物件數量來實現,這樣的處理是非常有意義的.

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

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

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

定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法使乙個類的例項化延遲到其子類。型別 建立類模式 類圖 inte ce iproduct class product implements iproduct inte ce ifactory class factory impleme...

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

工廠方法 factorymethod 模式定義 定義乙個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中,滿足建立型模式中所要求的 建立與使用相分離 的特點。如果建立的產品 物件 不多,只有乙個工廠類就可以的話,這種模式稱為 簡單工廠模式 但它不屬於23中設計模式,因為增加產品...

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

工廠方法模式 1.來個實物類介面 public inte ce phone2.實現介面,來個華為手機類 public class huaweiphone implements phone 3.來個小公尺手機類 public class xiaomiphone implements phone 4.簡...