抽象工廠模式

 

工廠方法模式通過引入工廠等級結構,解決了簡單工廠模式中工廠類職責太重的問題,但由於工廠方法模式中的每個工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。此時可以考慮將一些相關的產品組成一個“產品族”,由同一個工廠來統一生產,這就是抽象工廠模式的基本思想。

首先我們先來學習一些產品等級結構和產品族這兩個概念。

1.產品等級結構:產品等級結構即產品的繼承結構,例如一個抽象類是電腦,其子類由蘋果電腦,華爲電腦,小米電腦等,則抽象的電腦與具體品牌的電腦之前就構成了一個產品等級結構,抽象電腦類是父類,而具體的品牌電腦是其子類。

2.產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品。例如蘋果公司工廠生產的蘋果電腦,華爲公司工廠生產的華爲電腦,小米公司工廠生產的小米電腦位於電腦產品等級結構中;而蘋果公司工廠生產的蘋果手機,華爲公司工廠生產的華爲手機,小米公司工廠生產的小米手機位於手機產品等級結構中。由蘋果公司工廠生產的蘋果電腦,蘋果手機組成了一個產品族;華爲公司工廠生產的華爲電腦,華爲手機組成了一個產品族;小米公司工廠生產的小米電腦,小米手機又組成了一個產品族。

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

其中不同顏色的多個正方形,圓形和橢圓形分別構成了3個不同的產品等級結構,而相同顏色的正方形,圓形和橢圓形構成了一個產品族,每一個形狀對象都位於某個產品族,並屬於某個產品等級結構。

當系統所提供的工廠生產的具體產品並不是一個簡單的對象,而是多個位於不同產品等級結構、屬於不同類型的具體產品時,就可以使用抽象工廠模式。抽象工廠模式時所有形式的工廠模式中最爲抽象和最具一般性的一種形式。抽象工廠模式和工廠方法模式最大的區別在於,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品對象的創建。當一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有對象時,抽象工廠模式比工廠方法模式更爲簡單,更有效率。

抽象工廠模式的定義如下:

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

抽象工廠模式包含以下4個角色:

1.AbstractFactory(抽象工廠):它聲明瞭一組用於創建一族產品的方法,每個方法對應一種產品。

2.ConcreteFactory(具體工廠):它實現了在抽象工廠中聲明的創建產品的方法,負責生產一組具體產品,這些產品構成了一個產品族,每一個產品都位於某個產品等級結構中。

3.AbstractProduct(抽象產品):它爲每種產品聲明接口,在抽象產品中聲明瞭產品所具有的業務方法。

4.ConcreteProduct(具體產品):它定義具體工廠生產的具體產品對象,實現了在抽象產品接口中聲明的業務方法。

在抽象工廠類中聲明瞭多個工廠方法,用於創建不同類型的產品,抽象工廠可以時接口,也可以是抽象類或具體類,其UML圖如下:


/**
 * 電腦類(抽象產品類)
 */
public interface Computer {

    //業務方法
    void display();

}
/**
 * 蘋果電腦類(具體產品類)
 */
public class AppleComputer implements Computer{

    @Override
    public void display() {
        System.out.println("蘋果電腦顯示");
    }
}
/**
 * 華爲電腦類(具體產品類)
 */
public class HuaweiComputer implements Computer{

    @Override
    public void display() {
        System.out.println("華爲電腦顯示");
    }
}
/**
 * 手機類(抽象產品類)
 */
public interface Phone {

    //業務方法
    void call();
}
/**
 * 蘋果手機類(具體產品類)
 */
public class ApplePhone implements Phone {

    @Override
    public void call() {
        System.out.println("蘋果手機打電話");
    }
}
/**
 * 華爲手機類(具體產品類)
 */
public class HuaweiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("華爲手機打電話");
    }
}
/**
 * 抽象工廠類
 */
public interface AbstractFactory {

    //生產電腦
    Computer createComputer();

    //生產手機
    Phone createPhone();
}
/**
 * 蘋果工廠(具體工廠類),負責具體蘋果產品的生產
 */
public class AppleFactory implements AbstractFactory {

    @Override
    public Computer createComputer() {
        return new AppleComputer();
    }

    @Override
    public Phone createPhone() {
        return new ApplePhone();
    }
}
/**
 * 華爲工廠(具體工廠類),負責具體華爲產品的生產
 */
public class HuaweiFactory implements AbstractFactory {

    @Override
    public Computer createComputer() {
        return new HuaweiComputer();
    }

    @Override
    public Phone createPhone() {
        return new HuaweiPhone();
    }
}

抽象工廠模式的主要優點如下:

1.抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易,所有的具體工廠都實現了在抽象工廠中聲明的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統的行爲;

2.當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象;

3.增加信息的產品族很方便,無須修改已有系統,符合開閉原則。

抽象工廠模式的主要缺點如下:

抽象工廠模式主要的缺點就是:增加新的產品等級結構很麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層的代碼,這顯然會帶來較大的不便,違背了開閉原則。

抽象工廠模式的主要適用場景如下:

1.一個系統不應當依賴於產品類的實例如何被創建、組合和表達的細節,對於所有類型的工廠模式都是很重要的,用戶無須對象的創建過程,將對象的創建和使用解耦;

2.系統中有多於一個的產品族,而每次只使用其中某一個產品族。可以通過配置文件等方式來使得用戶可以動態改變產品族,也可以很方便地增加新的產品族;

3。屬於同一個產品族地產品將在一起使用,這一約束必須在系統地設計中體現出來。同一個產品族中地產品可以是沒有任何關係地對象,但它們都具有一些共同地約束,例如同一個操作系統下地按鈕和文本框,按鈕和文本框之間沒有直接關係,但它們都屬於某一操作系統,此時具有一個共同地約束條件:操作系統地類型;

4.產品等級結構文檔,設計完成之後,不會向系統中增加新的產品等級結構或者刪除已有地產品等級結構。

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