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

2022-11-07 06:01:30

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 品牌,有的人喜歡華為品牌。然後手機、手錶、平板都打算使用同一系列,這種情況就非常符合抽象工廠模式。