設計模式二 工廠方法模式

2021-07-01 22:43:37 字數 2267 閱讀 4893

在眾多設計模式裡面使用最多的乙個就是工廠方法模式,下面我們先來看乙個例子:

//抽象產品

inte***ce iproduct

//具體產品

class product implements iproduct

}//抽象工廠

inte***ce ifactory

//具體工廠

class factory implements ifactory

}public class client

}output:產品

不難看出,工廠方法模式有以下幾個角色:

● product(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。

● concreteproduct(具體產品):它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。

● factory(抽象工廠):在抽象工廠類中,宣告了工廠方法(factory method),用於返回乙個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面。

● concretefactory(具體工廠):它是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並可由客戶端呼叫,返回乙個具體產品類的例項。

工廠方法模式(factory method pattern):定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。工廠方法模式讓乙個類的例項化延遲到其子類。工廠方法模式又簡稱為工廠模式(factory pattern),又可稱作虛擬構造器模式(virtual constructor pattern)或多型工廠模式(polymorphic factory pattern)。工廠方法模式是一種類建立型模式。

工廠方法模式有以下優點:

(1) 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。

(2) 基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類。

(3) 使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了,這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。

接下來我們繼續設計乙個使用工廠方法模式的例子:

使用工廠方法模式設計乙個程式來讀取各種不同型別的格式,針對每一種格式都設計乙個讀取器,如jpg讀取器用於讀取jpg格式的,png有png的讀取器。

//抽象工廠

inte***ce ireadfactory

//具體工廠 生產png

class readpng implements ireadfactory

}//具體工廠 生產

}//抽象產品

inte***ce ipicture

//具體產品

class png implements ipicture

}//具體產品

png

在增加產品的時候只要新增具體產品和具體工廠就行了。

既然有優點,那肯定也有缺點了:

(1) 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。

(2) 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。

適用場景:

(1) 客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立,可將具體工廠類的類名儲存在配置檔案或資料庫中。

(2) 抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。

設計模式(二) 工廠模式(工廠方法)

之前學習了簡單工廠我們明白了,簡單工廠雖然有一定的好處,但是還不夠好,它無法滿足開閉原則,我們在如果新增產品的話,就需要更改已有的工廠類。工廠方法模式就是在簡單工廠的基礎上,滿足開閉原則,讓我們只需要新增類就好,不用去更改已有 展示下之前的database mysql sqlserver三個類。pa...

設計模式(二) 工廠方法模式

工廠方法 factory method 模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品...

設計模式(二) 工廠方法模式

工廠方法 factory method 模式的意義是定義乙個建立產品物件的工廠介面。將實際建立工作推遲到子類其中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責詳細工廠子類必須實現的介面,這樣進一步抽象化的優點是使得工廠方法模式能夠使系統在不改動詳細工廠角色的情況下引進新的產品...