1. 程式人生 > >工廠模式詳解

工廠模式詳解

產品族 class format 負責 依賴 圖片 sim 利用 擴展

工廠模式的幾種形態:

·簡單工廠模式:又稱靜態工廠模式

·工廠方法模式:又稱多態性工廠模式或虛擬構造子模式

·抽象工廠模式:又稱工具箱模式

===============================================================================

簡單工廠模式:

技術分享圖片

簡單工廠模式的退化:

·抽象產品類與工廠類合並

技術分享圖片

·抽象產品類與工廠類、具體產品類合並

技術分享圖片

簡單工廠模式的優點:

·工廠類含有必要的判斷邏輯,負責創建產品實例,避免客戶端創建產品,實現了責任的分割

簡單工廠方法的缺點:

·工廠類成為關鍵類,該類的異常將導致其所管理的所有產品類受到影響

·工廠類負責判斷創建產品的時機和具體創建哪一種產品,導致工廠類的擴展較為困難

·簡單工廠模式使用靜態方法作為工廠方法,無法被子類所繼承,無法形成基於繼承的等級結構

·有限程度上支持“開-閉”原則,工廠模式的系統中擴展來自於新產品加入系統,對於客戶端只需要調用工廠類的工廠方法即可,無需修改;但是對於工廠類,必須要知道每一種產品和如何創建它們,擴展需要修改源碼

簡單工廠方法在Java中的應用:

·java.text.DateFormat(抽象產品類和工廠類)中的的靜態方法getDateInstance()方法返回子類SimpleDateFormat(具體產品類)對象

·XMLReaderFactory

(抽象產品類和工廠類)和XMLReader(具體產品類)

===============================================================================

工廠方法模式:

技術分享圖片

工廠方法模式的多態性喪失和模式退化:

·工廠方法創建對象:工廠方法返回的對象一定是自身創建而不是外部傳入的

·工廠方法返回值類型:應當是抽象類型而不是具體類型,否則將會導致多態性的喪失而退化

·工廠等級結構:當只有一個具體工廠類時可以省略抽象工廠類,發生退化,此時通常可以由簡單工廠模式代替

工廠方法模式在Java中的應用:

·Collection接口規定的方法

iterator()方法返回一個Iterator對象,所有實現了該接口的聚集類必須實現該工廠方法

·URL(工廠類)和URLCollection(抽象類),openConnection(工廠方法)

===============================================================================

抽象工廠模式:

技術分享圖片

利用抽象工廠模式創建隸屬於不同產品等級結構同一產品族的多個產品:

技術分享圖片

使用抽象工廠模式的情形:

·一個系統不依賴於產品類如何被創建、組合和表達的細節,這對於所有形式的工廠模式都是重要的

·這個系統有多於一個的產品族,而系統只消費其中某一族的產品

·同屬於同一產品族的產品是在一起使用的

·系統提供一個產品類的庫,所有的產品以同樣的接口實現,從而使客戶端不依賴於實現

抽象工廠方法的一個例子:

·ButtonText這兩個視窗構件在UNIXWindows下有不同的實現,UnixButtonUnixText即為一個產品族,UnixButtonWinButton即為一個產品等級結構,應用抽象工廠模式得到如下結構

技術分享圖片

抽象工廠模式的擴展:

·增加新的產品族:只需向系統中添加新的新的具體工廠類即可,支持“開-閉”原則

·增加新的新的產品等級:需要修改所有的工廠角色,不支持“開-閉”原則

工廠模式詳解