23種設計模式-抽象工廠模式介紹加實戰程式碼

1、描述

通俗一點來講,抽象工廠模式就是在工廠方法模式的抽象工廠類中規範多個同類產品。

工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠,而抽象工廠模式是多個產品系列一個工廠類。

工廠模式中的每一個形態都是針對一定問題的解決方案,工廠方法針對的是多個產品系列結構;而抽象工廠模式針對的是多個產品族結構,一個產品族內有多個產品系列

2、適用性

抽象工廠模式可以看作工廠方法模式的擴展,在一個系統要由多個產品系列中的一個來配置時,工廠方法模式無法滿足,這時就可以使用抽象工廠模式。這樣介紹有點晦澀,下面通過實戰程式碼的例子很好理解。

3、實現邏輯

  • 抽象產品類 :工廠類所創建的所有對象的超類,它負責描述所有實例所共有的公共介面。定義產品的規範,描述了產品的主要特性和功能。
  • 具體產品類 :實現或者繼承抽象產品的子類;是工廠模式的創建目標,所有創建的對象都是這個具體類的實例。在抽象工廠模式中某具體產品有專門的具體工廠類創建,但不同於工廠方法模式,它們之間是一對多的關係,及一個具體工廠類可以創建多個具體產品類。
  • 抽象工廠類:是工廠方法模式的核心,與應用程式無關。任何在模式中創建的對象的工廠類必須實現這個介面。制定具體工廠類的規範。
  • 具體工廠類:主要是實現抽象工廠中的抽象方法,完成具體產品的創建。可供客戶端直接調用某一方法創建出具體產品實例。

4、實戰程式碼

之前的工廠方法模式,我們用的 Tea 和 Coffee 為例。但是在實際生活中,Tea 和 Coffee 都有著許多種類。下面我們通過 BlackTea 和 GreenTea 以及 Nestle 和 Latte 這個幾種飲品為具體產品類,DrinksAFactory 和 DrinksBFactory 為分別可以創建 BlackTea 、Nestle 和 GreenTea 、Latte 的工廠類來簡單演示抽象工廠模式。

/**
 * 抽象產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:19:25
 */
public abstract class Tea {
}

/**
 * 具體產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:21:19
 */
public class BlackTea extends Tea {
    public BlackTea() {
        System.out.println("BlackTea");
    }
}

/**
 * 具體產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:21:56
 */
public class GreenTea extends Tea{
    public GreenTea() {
        System.out.println("GreenTea");
    }
}

/**
 * 抽象產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:26:36
 */
public abstract class Coffee {
}

/**
 * 具體產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:22:26
 */
public class Nestle extends Coffee {
    public Nestle() {
        System.out.println("Nestle");
    }
}

/**
 * 具體產品類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:23:15
 */
public class Latte extends Coffee {
    public Latte() {
        System.out.println("Latte");
    }
}

/**
 * 抽象工廠類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 08:03:13
 */
public interface DrinksFactory {
    Coffee createCoffee();

    Tea createTea();
}

/**
 * 具體工廠類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:26:53
 */
public class DrinksAFactory implements DrinksFactory {

    @Override
    public Coffee createCoffee() {
        return new Nestle();
    }

    @Override
    public Tea createTea() {
        return new BlackTea();
    }
}

/**
 * 抽象工廠類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:26:53
 */
public class DrinksBFactory implements DrinksFactory {

    @Override
    public Coffee createCoffee() {
        return new Latte();
    }

    @Override
    public Tea createTea() {
        return new GreenTea();
    }
}

/**
 * 測試類
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:41:14
 */
public class Client {

    public static void main(String[] args) {
        DrinksFactory drinksAFactory = new DrinksAFactory();
        Coffee coffeeA = drinksAFactory.createCoffee();
        Tea teaA = drinksAFactory.createTea();

        DrinksFactory drinksBFactory = new DrinksBFactory();
        Coffee coffeeB = drinksBFactory.createCoffee();
        Tea teaB = drinksBFactory.createTea();
    }
}

客戶端執行結果:

從結果可以看出,A 工廠和 B 工廠根據同樣的方法創建不同系列的實例。實際開發中, 系統中有多個產品族,但每次只使用其中的某一族產品。

例如,有的人喜歡 APPLE 品牌,有的人喜歡華為品牌。然後手機、手錶、平板都打算使用同一系列,這種情況就非常符合抽象工廠模式。