設計模式:抽象工廠模式

設計模式:抽象工廠模式


定義

抽象工廠模式標準定義:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(爲創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。)

結構類圖

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠

  • ConcreteFactory:具體工廠

  • AbstractProduct:抽象產品

  • Product:具體產品

AbatractFactory

抽象工廠模式的使用場景是,系統中有多個產品族,同一個產品族中的產品將一起使用。

如圖,產品等級爲1的產品族,生產等級爲1的全部產品。
產品等級爲2的產品族,生產等級爲2的全部產品。

代碼

抽象產品類A:

public abstract class AbstractProductA {
    // 每個產品共有的方法
    public void shareMethod() {
    }

    // 每個產品相同方法,不同實現
    public abstract void doSomething();
}

產品A1的實現類:

public class ProductA1 extends AbstractProductA {

    @Override
    public void doSomething() {
        System.out.println("產品A1的實現方法");
    }

}

產品A2的實現類:

public class ProductA2 extends AbstractProductA {

    @Override
    public void doSomething() {
        System.out.println("產品A2的實現方法");
    }

}

抽象產品類B:

public abstract class AbstractProductB {
    // 每個產品共有的方法
    public void shareMethod() {
    }

    // 每個產品相同方法,不同實現
    public abstract void doSomething();
}

產品B1的實現類:

public class ProductB1 extends AbstractProductB {

    @Override
    public void doSomething() {
        System.out.println("產品B1的實現方法");
    }

}

產品B2的實現類:

public class ProductB2 extends AbstractProductB {

    @Override
    public void doSomething() {
        System.out.println("產品B2的實現方法");
    }

}

抽象工廠類AbstractCreator定義每個工廠要實現的功能,在同一個產品族中有多少類產品,就需要定義多少個創建方法。在通用代碼中,抽象工廠類定義了A、B兩種產品的產品創建:

/*
 * 抽象工廠類
 */
public abstract class AbstractCreator {
    // 創建A產品
    public abstract AbstractProductA createProductA();

    // 創建B產品
    public abstract AbstractProductB createProductB();
}

下面來看具體的實現類。有多少個產品族,就有多少個工廠實現類。

產品等級1的實現類:

public class Creator1 extends AbstractCreator {

    // 只生產產品等級爲1的A產品
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    // 只生產產品等級爲1的B產品
    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }

}

產品等級2的實現類:

public class Creator2 extends AbstractCreator {

    // 只生產產品等級爲2的A產品
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    // 只生產產品等級爲2的B產品
    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }

}

場景類:

public class Client {

    public static void main(String[] args) {
        // 定義出兩個工廠
        AbstractCreator creator1 = new Creator1();
        AbstractCreator creator2 = new Creator2();
        // 產生A1對象
        AbstractProductA a1 = creator1.createProductA();
        // 產生A2對象
        AbstractProductA a2 = creator2.createProductA();
        // 產生B1對象
        AbstractProductB b1 = creator1.createProductB();
        // 產生B2對象
        AbstractProductB b2 = creator2.createProductB();
        /*
         * 然後在這裏就可以爲所欲爲了...
         */
    }

}

優點

  • 抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被創建。由於這種隔離,更換一個具體工廠就變得相對容易。
  • 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象。
  • 增加新的具體工廠和產品族很方便,無須修改已有系統,符合“開閉原則”。

缺點

  • 在添加新的產品對象時,將涉及到對抽象工廠角色及其所有子類的修改,會帶來很大不便。
  • 開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品結構麻煩)。

抽象工廠、工廠方法、簡單工廠

  • 抽象工廠:一個抽象工廠接口,多個工廠實現類
  • 工廠方法:一個抽象工廠接口,一個工廠實現類
  • 簡單工廠:一個擁有靜態工廠方法的工廠類

當抽象工廠模式中每一個具體工廠類只創建一個產品對象,也就是隻存在一個產品等級結構時,抽象工廠模式退化成工廠方法模式;當工廠方法模式中抽象工廠與具體工廠合併,提供一個統一的工廠來創建產品對象,並將創建對象的工廠方法設計爲靜態方法時,工廠方法模式退化成簡單工廠模式。

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