設計模式之3 抽象工廠模式

2021-07-31 14:47:49 字數 1541 閱讀 2168

抽象工廠模式

之前我們在學習工廠模式中,如果要增加乙個產品,那麼就會同時增加乙個具體產品類和對應的具體工廠類,這會導致系統中的類數量成對的增加,加重系統的負擔。而對於有些場景下我們使用的是一系列的類,這個時候我們就可以考慮將一些相關的產品組成乙個產品「產品族」,然後由同乙個工廠來統一生產。

在工廠模式中,每乙個具體工廠都是針對乙個具體產品的,工廠方法具有唯一性。那麼為了更好的理解抽象工廠模式,先介紹兩個概念:

產品等級結構。即產品的繼承結構,如乙個抽象類是電視機,那麼子類就可以有海爾電視機、tcl電視機等,抽象電視機與具體電視機之前就構成了乙個產品等級結構,抽象電視機是父類,而具體電視機是子類。

產品族。產品族指同乙個工廠生產的,位於不同產品等級結構的一組產品。如海爾工廠生產海爾電視機、海爾電冰箱等。

產品等級結構與產品族示意圖如下圖所示:

抽象工廠模式是所有形式的工廠模式中最為抽象與最具有一般性的一種形式。抽象工廠模式與工廠方法模式的最大區別是:工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式需要面對的是多個產品等級結構,乙個工廠等級結構可以負責多個不同產品等級結構中的產品物件的建立。當乙個工廠等級結構可以建立出分屬於不同產品等級結構的乙個產品族中的所有物件時,抽象工廠模式比工廠方法模式更簡單效率。

抽象工廠模式結構如圖所示:

在上面的結構圖中,包含以下幾個角色:

抽象工廠

abstract class abstractfactory
具體工廠。具體工廠實現了抽象工廠,每乙個具體的工廠方法都返回乙個特定的產品物件,同乙個工廠建立的產品構成乙個產品族

class concretefactory1 extends abstractfactory 

public abstractproductb createproductb()

}class concretefactory2 extends abstractfactory

public abstractproductb createproductb()

}

上面的**中每乙個具體工廠都包含兩個工廠方法,分別生產產品a和b,而a1和b1、a2和b2分別構成了乙個產品族。

那麼客戶端呼叫的時候就可以如下實現:

class client 

}

在抽象工廠模式中,增加新的產品族很方便,但是增加新的產品等級結構很麻煩,因為當增加新的產品等級結構的話,那麼就需要修改抽象工廠的介面,之後針對每個具體工廠類修改實現。抽象工廠模式這種性質稱為「開閉原則」的傾斜性。

總結:

所有的具體工廠都實現了抽象工廠定義的那些介面,當需要改變產品族的時候,只需要修改具體工廠的例項即可,無須知道什麼產品被建立。另外使用抽象工廠模式也能夠保證客戶端始終只使用同乙個產品族中的物件。

缺點: 當增加新的產品等級結構的時候,需要對原來系統中的抽象工廠,具體工廠都進行修改,違背了開閉原則。(開閉原則的傾斜性)

優點: 系統不應當關心產品類例項是如何被建立的細節,將物件的建立和使用解耦。確保同乙個產品族中的產品將在一起使用。

抽象工廠模式 設計模式3之抽象工廠模式

工廠方法模式中工廠只負責同類產品的生產。比如電視機工廠不應該生產汽車。然而現實生活中有很多綜合型的工廠,比如有些電視工廠不僅生產電視機,還會生產與之配套的機頂盒。那麼抽象工廠模式隨之誕生,這種模式將考慮多種型別產品的生產。我們總結下 工廠方法模式只考慮成產同一等級級的產品抽象方法模式考慮生產多等級的...

設計模式之工廠模式 3 抽象工廠模式

使用抽象工廠模式完成披薩案例 是乙個抽象工廠模式的抽象層 public inte ce absfactory public class bjfactory implements absfactory else if ordertype.equals pepper return pizza publi...

3 設計模式 抽象工廠模式

以下內容摘自 在此權作為筆記 上一章我們分析了簡單工廠模式與工廠方法模式,這一章我們來 一下抽象工廠模式。先看菜鳥教程上給的定義。主要解決 主要解決介面選擇的問題。何時使用 系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。如何解決 在乙個產品族裡面,定義多個產品。關鍵 在乙個工廠裡聚合多...