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

上兩篇講解了簡單工廠模式工廠方法模式,下面講解工廠模式的最後一個抽象工廠模式

隨着客戶的要求越來越高,寶馬車需要不同配置的空調和發動機等配件。於是這個工廠開始生產空調和發動機,用來組裝汽車。這時候工廠有兩個系列的產品:空調和發動機。寶馬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();
    }
}

抽象工廠模式組成:

  1. AbstractFactory:抽象工廠
  2. ConcreteFactory:具體工廠
  3. AbstractProduct:抽象產品(多個)
  4. Product:具體產品

優點:

  1. 抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易。所有的具體工廠都實現了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統的行爲。另外,應用抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式得到了廣泛的應用。
  2. 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。這對一些需要根據當前環境來決定其行爲的軟件系統來說,是一種非常實用的設計模式。
  3. 增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。

缺點:

  1. 在添加新的產品對象時,難以擴展抽象工廠來生產新種類的產品,這是因爲在抽象工廠角色中規定了所有可能被創建的產品集合,要支持新種類的產品就意味着要對該接口進行擴展,而這將涉及到對抽象工廠角色及其所有子類的修改,顯然會帶來較大的不便。
  2. 開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品等級結構麻煩)。

適用環境:

  1. 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
  2. 系統中有多於一個的產品族,而每次只使用其中某一產品族。
  3. 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
  4. 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。

總結:

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極爲相似的,他們的最終目的都是爲了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因爲他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。

更多精彩Android技術可以關注我們的微信公衆號,掃一掃下方的二維碼或搜索關注公共號: Android老鳥


這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章