在工廠方法模式中,我們使用乙個工廠建立乙個產品,也就是說乙個具體的工廠對應乙個具體的產品。但是有時候我們需要乙個工廠能夠提供多個產品物件,而不是單一的物件,這個時候我們就需要使用抽象工廠模式。
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的,抽象工廠迷失可以向客戶端提供乙個介面,使得客戶端在不必指定產品的具體型別的情況下,能夠建立多個產品族的產品物件。
在講解抽象工廠模式之前,我們需要釐清兩個概念:
產品等級結構。產品的等級結構也就是產品的繼承結構。例如乙個為空調的抽象類,它有海爾空調、格力空調、美的空調等一系列的子類,那麼這個抽象類空調和他的子類就構成了乙個產品等級結構。
產品族。產品族是在抽象工廠模式中的。在抽象工廠模式中,產品族是指由同乙個工廠生產的,位於不同產品等級結構中的一組產品。比如,海爾工廠生產海爾空調。海爾冰箱,那麼海爾空調則位於空調產品族中。
產品等級結構和產品族結構示意圖如下:
uml結構圖
模式結構說明:
abstractfactory:抽象工廠。抽象工廠定義了乙個介面,所有的具體工廠都必須實現此介面,這個介面包含了一組方法用來生產產品。
concretefactory:具體工廠。具體工廠是用於生產不同產品族。要建立乙個產品,客戶只需要使用其中乙個工廠完全不需要例項化任何產品物件。
abstractproduct:抽象產品。這是乙個產品家族,每乙個具體工廠都能夠生產一整組產品。
product:具體產品。
還是用之前的水果的例子
現在有兩個產品族: 南方水果, 北方水果
產品結構 :蘋果、香蕉
public inte***ce fruit
public abstract void eat();
}
public abstract class banana implements fruit
@override
public void eat() }
@override
public void eat()
}
public class northbanana extends banana
}
public class southbanana extends banana
}
水果分為蘋果和香蕉 蘋果分為南方蘋果、北方蘋果 香蕉分為南方香蕉、北方香蕉
那我們使用抽象工廠模式是如何實現的呢:
public inte***ce fruitfactory
南方水果工廠獲得南方蘋果和南方香蕉的例項
public class northfruitfactory implements fruitfactory
public fruit getbanna()
}
北方水果工廠獲得北方蘋果和北方香蕉的例項
public class southfruitfactory implements fruitfactory
public fruit getbanna()
}
public static void main(string args)
執行結果:
吃南方的蘋果
吃南方的香蕉
吃北方的蘋果
吃北方的香蕉
此時又新加了乙個產品族 溫室水果
@override
public void eat()
}
public class greenhousebanana extends banana
}
public class greenhousefruitfactory implements fruitfactory
@override
public fruit getbanna()
}
public static void main(string args)
執行結果:
吃南方的蘋果
吃南方的香蕉
吃北方的蘋果
吃北方的香蕉
吃溫室蘋果
吃溫室香蕉
優點
1、 抽象工廠隔離了具體類的生成,是的客戶端不需要知道什麼被建立。所有的具體工廠都實現了抽象工廠中定義的公共介面,因此只需要改變具體工廠的例項,就可以在某種程度上改變整個軟體系統的行為。
2、 當乙個產品族中的多個物件被設計成一起工作時,它能夠保證客戶端始終只使用同乙個產品族中的物件。
缺點
新增新的行為時比較麻煩。如果需要新增乙個新產品族物件時,需要更改介面及其下所有子類,這必然會帶來很大的麻煩。
模式使用場景
乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有型別的工廠模式都是重要的。
2.系統中有多於乙個的產品族,而每次只使用其中某一產品族。
屬於同乙個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現。
總結
抽象工廠模式中主要的優點在於具體類的隔離,是的客戶端不需要知道什麼被建立了。其缺點在於增加新的等級產品結構比較複雜,需要修改介面及其所有子類。
抽象工廠中方法對應產品結構,具體工廠對應產品族
IOS設計模式之工場模式
在基類中定義建立物件的乙個介面,讓子類決定實列化那個類.工廠方法讓乙個類的實列化延遲到子類進行.工廠方法解決的問題是 物件的建立時機,它提供了一種擴充套件的策略,很好的符合了開放封閉原則.將工廠和產品都抽象出乙個基類,在基類中定義統一的介面,然後再具體的工廠同建立具體的產品.與直接建立新的具體物件相...
android設計模式 簡單工場模式
例1 思路 蘋果類,包含獲取蘋果的方法。香蕉類,包含獲取香蕉的方法。主類 建立蘋果例項,香蕉例項,分別呼叫獲取方法。改進1 有共同方法 抽象出乙個水果介面 改進2 建立出乙個水果工廠,完成獲取蘋果,獲取香蕉的行為。優勢 主類只需要建立乙個工廠類即可。改進3 將水果工廠中的獲取方法設定成靜態。優勢 呼...
抽象工廠模式 抽象工廠模式
抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...