java設計模式【抽象工廠模式】
抽象工廠模式
抽象工廠模式是對簡單工廠模式的一個變種,它允許通過一個統一的介面來創建不同的產品實體,而無需指定具體的子類,在這個模式中,我們只關心產品的抽象介面,而將具體的產品實作留給子類去實作,這樣,我們可以通過創建不同的工廠物件來創建不同的產品實體,而無需關心它們實際實作的是哪個具體產品,
抽象工廠模式的實作分為以下幾個步驟:
- 定義抽象產品介面:抽象工廠模式的核心是抽象產品介面,它定義了產品的基本結構和行為,
- 定義具體工廠介面:具體工廠介面是實作抽象產品介面的工廠類,它們負責創建具體產品實體,
- 定義工廠:每個具體工廠都是一個特定領域的工廠,它實作了抽象工廠介面,并提供了具體的產品實作,
- 創建產品實體:使用抽象工廠介面,客戶端可以創建不同的產品實體,而無需指定具體的子類,
優缺點
優點:
- 具體產品在應用層的代碼隔離,無需關系創建的細節,
- 將一個系列的產品統一到一起創建,方便產品族的擴展,
- 提供一個產品類的庫,所有的產品以同樣的介面出現,使得客戶端不依賴于具體實作,
- 通過創建不同的工廠物件來創建不同的產品實體,無需關心它們實際實作的是哪個具體產品,
缺點:
- 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,
- 增加了系統的抽象性和理解難度,
- 使用場景:客戶端(應用層)不依賴與產品類的實作等細節,
- 需要大量的重復代碼,增加了開發和維護的成本,
使用場景
- 一個系統要獨立于它的產品的創建、組合和表示時,
- 一個系統要由多個產品系列中的一個來配置時,
- 需要強調一系列相關的產品物件的設計以便進行聯合使用時,
- 提供一個產品類別庫,而只想顯示它們的介面而不是實作時,
- 產品之間相互關聯、相互依賴且相互約束的地方,
具體實作
以下以智能產品汽車和手機為例,繼承關系如下:

定義抽象工廠
/**
* 智能產品抽象工廠
*/
public interface SmartProductFactory {
ISmartPhone createSmartPhone();
ISmartCar createSmartCar();
}
具體工廠
/**
* @author physicx
* @date 2023/5/17 上午11:18
* @desc 華為工廠
* Created with IntelliJ IDEA
*/
public class HuaweiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new HuaweiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new HuaweiSmartCar();
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:18
* @desc 小米工廠
* Created with IntelliJ IDEA
*/
public class XiaomiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new XiaomiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new XiaomiSmartCar();
}
}
定義抽象產品
/**
* 智能手機
*/
public interface ISmartPhone {
void printInfo();
}
/**
* 智能汽車
*/
public interface ISmartCar {
void printInfo();
}
具體產品
/**
* @author physicx
* @date 2023/5/17 上午11:19
* @desc 華為智能汽車
* Created with IntelliJ IDEA
*/
public class HuaweiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("華為智能汽車");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 華為智能手機
* Created with IntelliJ IDEA
*/
public class HuaweiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("華為智能手機");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能汽車
* Created with IntelliJ IDEA
*/
public class XiaomiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("小米智能汽車");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能手機
* Created with IntelliJ IDEA
*/
public class XiaomiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("小米智能手機");
}
}
客戶端呼叫
public static void main(String[] args) {
HuaweiFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.createSmartPhone().printInfo();
huaweiFactory.createSmartCar().printInfo();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.createSmartPhone().printInfo();
xiaomiFactory.createSmartCar().printInfo();
}
列印如下:

工廠方法模式和抽象工廠模式區別
工廠方法模式和抽象工廠模式都是創建型模式,區別如下:
- 工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個,
- 工廠方法模式的具體工廠類只能創建一個具體產品類的實體,而抽象工廠模式可以創建多個,
- 工廠方法模式的使用很簡單,只要繼承成子類,并實作工廠方法的工廠就可以了,而抽象工廠模式需要先實體化它,然后將它傳入一些針對抽象型別所寫的代碼中,
- 工廠方法模式的優點是可以把一群相關的產品集合起來,而抽象工廠模式的優點是可以把一群相關的產品集合起來,并且創建整個產品家族的模式,
總之,工廠方法是由子類自行決定實體化那個類,而抽象工廠是自己決定實體化哪個類,至于是組合還是繼承還是實作介面都無所謂,根本區別在于是自己實體化還是子類實體化,
如果產品單一,只有一個產品等級結構適合使用工廠方法模式,如果存在多個產品等級,產品分類多個可以形成產品族合適使用抽象工廠模式,
補充說明
后續會依次更新 詳解java 23種設計模式,歡迎關注、交流、補充相關內容(如下),
| 快捷導航 |
|---|
| 設計模式簡介總結 |
| 單例模式詳解 |
| 工廠方法模式 |
| 抽象工廠模式 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552669.html
標籤:其他
上一篇:web應用模式、API介面、介面測驗工具postman、如何在瀏覽器中測驗、restful規范、序列化反序列化、基于Django原生撰寫五個介面、drf介紹和快速使用、drf之APIView原始碼分析
下一篇:返回列表
