建立型模式-抽象工廠

1. 定義

抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而
無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,它是一種對象建立型模式。git

2. 結構

在抽象工廠模式中,每個具體工廠都提供了多個工廠方法用於產生多種不一樣類型的產品,這些產品構成了一個產品族,抽象工廠模式結構如圖所示:設計模式

抽象工廠結構

  • AbstractFactory(抽象工廠):它聲明瞭一組用於建立一族產品的方法,每個方法對應一種產品。(一族產品理解爲海爾牌子的冰箱,洗衣機,電視機等)
  • ConcreteFactory(具體工廠):它實現了在抽象工廠中聲明的建立產品的方法,生成一組具體產品,這些產品構成了一個產品族,每個產品都位於某個產品等級結構中。
  • AbstractProduct(抽象產品):它爲每種產品聲明接口,在抽象產品中聲明瞭產品所具備的業務方法。(理解爲不一樣牌子冰箱的父類)
  • ConcreteProduct(具體產品):它定義具體工廠生產的具體產品對象,實現抽象產品接口中聲明的業務方法。

3. 代碼實現

同一個品牌的這邊給他算一個產品族,冰箱,電視算兩個產品等級結構,一個具體的工廠實現類能夠產生同一個品牌的不一樣的產品。
產品1接口ide

public interface Fridge {

    void freeze();

}

產品1實現類1測試

public class HaierFridge implements Fridge {

    @Override
    public void freeze() {
        System.out.println("海爾冰箱冰凍啦");
    }
}

產品2實現類2設計

public class MediaFridge implements Fridge {

    @Override
    public void freeze() {
        System.out.println("美的冰箱冰凍啦");
    }
}

產品2接口code

public interface Tv {

    void watch();
}

產品2實現類1對象

public class HaierTv implements Tv {

    @Override
    public void watch() {
        System.out.println("看海爾電視啦");
    }
}

產品2實現類2blog

public class MediaTv implements Tv {

    @Override
    public void watch() {
        System.out.println("看美的電視啦");
    }
}

工廠接口接口

public interface Factory {

    Tv getTv();

    Fridge getFridge();
}

工廠實現類1

public class HaierFactory implements Factory {

    @Override
    public Tv getTv() {
        return new HaierTv();
    }

    @Override
    public Fridge getFridge() {
        return new HaierFridge();
    }
}

工廠實現類2

public class MediaFactory implements Factory {

    @Override
    public Tv getTv() {
        return new MediaTv();
    }

    @Override
    public Fridge getFridge() {
        return new MediaFridge();
    }
}

測試

public class Test {

    public static void main(String[] args) {
        //能夠從配置文件中得到具體類名,經過反射得到相應的工廠類來實現其配置化
        Factory factory1=new HaierFactory();
        factory1.getTv().watch();
        factory1.getFridge().freeze();

        Factory factory2=new MediaFactory();
        factory2.getTv().watch();
        factory2.getFridge().freeze();
    }
}

//看海爾電視啦
//海爾冰箱冰凍啦
//看美的電視啦
//美的冰箱冰凍啦

4. 「開閉原則」的傾斜性(最大缺點)

在抽象工廠模式中,增長新的產品族很方便(如添加一個牌子的產品族),可是增長新的產品等級結構(添加洗衣機這個新的產品登記結構)很麻煩,抽象工廠模式的這種性質稱爲「開閉原則」的傾斜性。「開閉原則」要求系統對擴展開放,對修改封閉,經過擴展達到加強其功能的目的,對於涉及到多個產品族與多個產品等級結構的系統,其功能加強包括兩方面:

  1. 增長產品族:對於增長新的產品族,抽象工廠模式很好地支持了「開閉原則」,只須要增長具體產品並對應增長一個新的具體工廠,對已有代碼無須作任何修改。
  2. 增長新的產品等級結構:對於增長新的產品等級結構,須要修改全部的工廠角色,包括抽象工廠類,在全部的工廠類中都須要增長生產新產品的方法,違背了「開閉原則」。

5. 優缺點

  • 優勢
  1. 抽象工廠模式隔離了具體類的生成,使得客戶並不須要知道什麼具體類被建立,只管調用工廠方法獲得對應的產品接口便可。
  2. 將同一個產品族的產品在工廠實現類中放在了一塊,使得客戶端始終使用同一族中的對象。
  3. 增長新的產品族很方便,無須修改已有系統,符合「開閉原則」。
  • 缺點
  1. 增長新的產品等級結構麻煩,須要對原有系統進行較大的修改,甚至須要修改抽象層代碼,這顯然會帶來較大的不便,違背了「開閉原則」。

6. 適用場景

  1. 用於對象的建立和使用的解耦,系統不依賴於產品類實例如何被建立、組合和表達的細節。
  2. 系統中有多於一個的產品族,而每次只使用其中某一產品族。能夠經過配置文件等方式來使得用戶能夠動態改變產品族,也能夠很方便地增長新的產品族。
  3. 屬於同一個產品族的產品將在一塊兒使用,這一約束必須在系統的設計中體現出來。(產品族須要具備一些共同約束,好比屬於同一個牌子等)
  4. 產品等級結構穩定,設計完成以後,不會向系統中增長新的產品等級結構或者刪除已有的產品等級結構。

7. 我的理解

將具備共同約束的多個產品放在一個族裏,工廠類中能夠產生多個屬於同一個產品族的產品,相比於工廠方法的每一個產品一個工廠類來講可大量減小類的數量。缺點就是不可擴展其餘產品種類。

參考

  1. Java設計模式-劉偉
相關文章
相關標籤/搜索