上兩篇講解了簡單工廠模式和工廠方法模式,下面講解工廠模式的最後一個抽象工廠模式
隨着客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品:空調和發動機。寶馬320Li系列配置A型號空調和A型號發動機,寶馬520Li系列配置B型號空調和B型號發動機。
概念:
抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。抽象工廠模式是工廠方法模式的升級版本,他用來創建一組相關或者相互依賴的對象。
先看看UML圖:
上面我們有兩種產品:空調Aircondition和引擎Engine,它們都有不同的型號,抽象工廠類AbstractFactoryBMW定義了需要生成空調和引擎,具體的工廠類按需生產相應的空調和引擎產品,下面是代碼:
產品類:
//發動機以及型號
public interface Engine {
}
public class EngineA implements Engine{
public EngineA(){
System.out.println("製造-->EngineA");
}
}
public class EngineB implements Engine{
public EngineB(){
System.out.println("製造-->EngineB");
}
}
//空調以及型號
public interface Aircondition {
}
public class AirconditionA implements Aircondition{
public AirconditionA(){
System.out.println("製造-->AirconditionA");
}
}
public class AirconditionB implements Aircondition{
public AirconditionB(){
System.out.println("製造-->AirconditionB");
}
}
工廠類:
//創建工廠的接口
public interface AbstractFactoryBMW {
//製造發動機
public Engine createEngine();
//製造空調
public Aircondition createAircondition();
}
//爲寶馬320系列生產配件
public class FactoryBMW320Li implements AbstractFactoryBMW{
@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public Aircondition createAircondition() {
return new AirconditionA();
}
}
//寶馬520系列
public class FactoryBMW520Li implements AbstractFactoryBMW {
@Override
public Engine createEngine() {
return new EngineB();
}
@Override
public Aircondition createAircondition() {
return new AirconditionB();
}
}
客戶:
public class Customer {
public static void main(String[] args){
//生產寶馬320Li系列配件
FactoryBMW320Li factoryBMW320Li = new FactoryBMW320Li();
factoryBMW320Li.createEngine();
factoryBMW320Li.createAircondition();
//生產寶馬520Li系列配件
FactoryBMW520Li factoryBMW523Li = new FactoryBMW520Li();
factoryBMW523Li.createEngine();
factoryBMW523Li.createAircondition();
}
}
抽象工廠模式組成:
- AbstractFactory:抽象工廠
- ConcreteFactory:具體工廠
- AbstractProduct:抽象產品(多個)
- Product:具體產品
優點:
- 抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易。所有的具體工廠都實現了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統的行爲。另外,應用抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式得到了廣泛的應用。
- 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。這對一些需要根據當前環境來決定其行爲的軟件系統來說,是一種非常實用的設計模式。
- 增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。
缺點:
- 在添加新的產品對象時,難以擴展抽象工廠來生產新種類的產品,這是因爲在抽象工廠角色中規定了所有可能被創建的產品集合,要支持新種類的產品就意味着要對該接口進行擴展,而這將涉及到對抽象工廠角色及其所有子類的修改,顯然會帶來較大的不便。
- 開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品等級結構麻煩)。
適用環境:
- 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
- 系統中有多於一個的產品族,而每次只使用其中某一產品族。
- 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
- 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。
總結:
無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極爲相似的,他們的最終目的都是爲了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因爲他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。
更多精彩Android技術可以關注我們的微信公衆號,掃一掃下方的二維碼或搜索關注公共號: Android老鳥