3.5抽象工廠模式
我們繼續對影像家電產品的情形進行分析,我們已經可以使用工廠方法比較好的實現了產品的建立,但是在以前的分析中我們並沒有考慮產品種類及生產廠家這樣的問題。就拿***來說tcl可以生產、lg也生產等等很多廠家都生產。***是產品種類中的一種,產品種類這個概念在有些書上稱為產品族。從另外乙個角度來看tcl可以生產***、vcd等等很多產品,這些產品在一起就可以構成乙個產品結構。當我們考慮了這些問題後,提出了兩個概念:產品種類、產品結構。我們在工廠方法中討論的是乙個個單一的產品的建立,如果我們對這個問題進行進一步的研究、拓展,就應該從單一的產品過度到多個產品種類,在工廠方法中我們考慮***是乙個單一的產品,現在我們認為***是乙個產品種類,有tcl生產的***,有lg生產的***,vcd是另乙個產品種類,有tcl生產的vcd,有lg生產的vcd。就這個問題我們重新分析,有兩個產品種類分別是***、vcd,有兩個工廠是tcl和lg,它們分別生產***和vcd。我們使用下面的類圖來表示:
***是抽象類它提供統一的介面,lg***、tcl***是兩個具體的類。vcd和***類似。有乙個抽象的工廠create,從它派生了兩個具體的類tclcreate、lgcreate。create中提供了兩個抽象方法factory***和factoryvcd它們提供了兩個介面,用於建立***產品和vcd產品。在tclcreate、lgcreate中實現這兩個方法。這樣tclcreate就可以建立自己的***、vcd,同樣lgcreate也可以傳經自己的產品。
下面是**結構:
public
abstract class create
public
class lgcreate: create
public override vcd factoryvcd()
} public
class tclcreate: create
public override vcd factoryvcd()
} public
abstract class ***
public
class lg***: ***
} public
class tcl***: ***
} public
abstract class vcd
public
class l**cd: vcd
} public
class tclvcd: vcd
} 客戶端使用抽象工廠**如下:
private void button1_click(object sender, system.eventargs e)
private void play***(create create)
下面將抽象工廠模式推廣到一般情況,它的類圖如下所示:
抽象工廠:提供所有具體工廠的介面,與應用系統的具體商業邏輯無關。基本上為每乙個產品種類提供乙個建立方法。
具體工廠:具體負責建立產品結構中每個產品。它包含了建立不同產品的商業邏輯。它實現抽象工廠中的介面。
抽象產品:定義產品的共同介面。
具體產品:是客戶需要建立的具體物件。
在工廠方法中每個工廠負責建立乙個產品,在抽象工廠中每個工廠建立一系列產品。在上面舉例中使用tcl、lg這樣的實際的工廠,在實際的應用中,往往是我們根據產品抽象了類,它們主要負責一系列產品的建立,將這些負責抽象工廠的類稱為具體工廠,從這些具體工廠更進一步進行抽象,抽象出的工廠稱為抽象工廠。下面我們看看抽象工廠模式的擴充套件。
抽象工廠的擴充套件包括了新增乙個產品種類及新增乙個工廠。當在現有的抽象產品下新增新的具體產品時我們僅僅需要增加乙個新的工廠就可以。比如現在有了haier(海爾)的***及vcd,我們很容易就實現擴充套件,而且也滿足了「開閉原則」。如下圖所示:
當我們有了乙個新的產品的增加的時候,就不能很好的滿足「開閉原則」了,因為我們需要修改每個產出的方法從而是現有的工廠可以建立出新的產品。比如我們增加乙個mp4產品種類。
由淺入深學「工廠模式」 2
3.4 工廠方法 有了簡單工廠模式後,已經給我們帶來了一些好處,但是還存在一些問題,如果我們又多了乙個影像家電產品mp4之後,我們可以使mp4類從videowiring派生,但是卻要修改create類的 使它能夠生產出mp4這個產品來。不好的地方就在於,我們每次多乙個產品的時候都需要修改create...
3 工廠模式
3 工廠模式 定義 為建立物件定義乙個介面,讓子類決定例項化那個類。工廠方法讓乙個類的例項化延遲至子類。工作模式封裝了例項化過程,client無需關心例項化的細節。使用工廠模式的場景 i.client不關心那個具體類,只關心實現的功能 ii.建立過程比較複雜 eg.讀取配置,初始化其他基礎類 iii...
單例模式由淺入深
單例模式指的是在應用整個生命週期內只能存在乙個例項。單例模式是一種被廣泛使用的設計模式。他有很多好處,能夠避免例項物件的重複建立,減少建立例項的系統開銷,節省記憶體。單例模式要求類能夠有返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 單...