「工廠模式」 2

2021-04-09 06:28:03 字數 1880 閱讀 6446

3.4 工廠方法

有了簡單工廠模式後,已經給我們帶來了一些好處,但是還存在一些問題,如果我們又多了乙個影像家電產品mp4之後,我們可以使mp4類從videowiring派生,但是卻要修改create類的**使它能夠生產出mp4這個產品來。不好的地方就在於,我們每次多乙個產品的時候都需要修改create而不是保持原來的**不修改僅僅進行一種擴充套件。在create類中修改不是每次都簡單的多乙個case語句就能夠解決問題。因為create類中還封裝了建立物件的邏輯,有可能還需要修改這些邏輯。這就違反了物件導向設計中乙個很重要的原則「開-閉」原則。

「開-閉」原則(the open closed principle ocp):

在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。開閉原則就是乙個軟體實體在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。這個原則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。通過擴充套件已有的軟體系統,可以提供新的行為,以滿足對軟體的新需求,使變化中的軟體系統有一定的適應性和靈活性。已有的軟體模組,特別是最重要的抽象層模組不能再修改,這就使得變化中的軟體系統有一定的穩定性和延續性。因此在進行物件導向設計時要盡量考慮介面封裝機制、抽象機制和多型技術。

前邊設計(簡單工廠)中存在的問題就是它分裝了建立不同物件的邏輯,當有新的產品的時候不易擴充套件。在開閉原則的指導下我們考慮如何重新修改前邊的設計,我們要盡量使用抽象機制和多型技術。我們放棄對建立不同物件的邏輯的封裝,也採用類似產品的方式,抽象出抽象工廠,具體工廠,具體工廠從抽象工廠派生,每個具體工廠中生產一種具體的產品。「太棒了,告訴你,你的這個想法就是工廠方法模式」。

下面使用工廠方法模式修改前邊的設計:

public

abstract

class

create

public

class

***create: create }

public

class

vcdcreate: create }

videowiring、***、vcd三個類的**和前邊的相同,下面我們看看在客戶端如何使用。

下面我們考慮需要擴充套件乙個新的產品mp4的時候如何處理。

private

void

playvideo()

我們來看看增加的**:

public

class

mp4create: create }

public

class

mp4: videowiring }

我們再看看客戶端**:

mp4的時候沒有修改原來的**,而僅僅是對原來的功能進行擴充套件系統便有了mp4這個產品的功能。

private

void

playvideo()

我們可以看出使用了工廠方法模式後,很好的滿足了開閉原則,當我們增加了乙個新的產品

將工廠方法模式推廣到一般情況:

角色說明:

抽象工廠(creator):定義具體工廠的介面,所有的建立物件的工廠類都必須實現這些介面。

抽象產品(product):所有產品的基類。

具體產品(concreteproduct):實現抽象產品申明的介面。工廠方法模式所建立的每個物件都是某個具體產品的例項。

工廠方法模式的用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有的產品的建立,而是將具體建立的工作交給子類去做。這個核心類則成為了乙個抽象工廠角色,僅負責給出具體工廠子類必須實現的介面,而不接觸哪乙個產品類應當被例項化這種細節。這種進一步抽象化的結果,使這種工廠方法模式可以用來允許系統在不修改具體工廠角色的情況下引進新的產品。

2 工廠模式

意圖 定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類 三個角色 1.抽象產品 2.具體產品 實現抽象產品 3.工廠類 建立產品例項的具體邏輯 情景 其實不止英雄聯盟,其他很多遊戲都是,在你名字建好之後,系統會預設彈出乙個選項框 0.第一次玩 1.我是大神 選擇0會自動進入新手教學...

工廠模式 2

解決方案 1 簡單工廠來解決 用來解決上述問題的乙個合理的解決方案就是簡單工廠,那麼什麼是簡單工廠呢?1 簡單工廠定義 2 應用簡單工廠來解決的思路 分析上面的問題,雖然不能讓模組外部知道模組內的具體實現,但是模組內部是可以知道實現類的,而且建立介面是需要具體實現類的。那麼乾脆在模組內部新建乙個類,...

設計模式2 工廠模式

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