通俗一點來講,抽象工廠模式就是在工廠方法模式的抽象工廠類中規範多個同類產品。
工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠,而抽象工廠模式是多個產品系列一個工廠類。
工廠模式中的每一個形態都是針對一定問題的解決方案,工廠方法針對的是多個產品系列結構;而抽象工廠模式針對的是多個產品族結構,一個產品族內有多個產品系列
抽象工廠模式可以看作工廠方法模式
的擴充套件,在一個系統要由多個產品系列中的一個來設定時,工廠方法模式無法滿足,這時就可以使用抽象工廠模式。這樣介紹有點晦澀,下面通過實戰程式碼的例子很好理解。
抽象工廠模式
中某具體產品有專門的具體工廠類建立,但不同於工廠方法模式,它們之間是一對多的關係,及一個具體工廠類可以建立多個具體產品類。之前的工廠方法模式,我們用的 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 品牌,有的人喜歡華為品牌。然後手機、手錶、平板都打算使用同一系列,這種情況就非常符合抽象工廠模式。