java設計模式【抽象工廠模式】 抽象工廠模式 抽象工廠模式是對簡單工廠模式的一個變種,它允許通過一個統一的介面來創建不同的產品實例,而無需指定具體的子類。在這個模式中,我們只關心產品的抽象介面,而將具體的產品實現留給子類去實現。這樣,我們可以通過創建不同的工廠對象來創建不同的產品實例,而無需關心它 ...
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種設計模式,歡迎關註、交流、補充相關內容(如下)。
快捷導航 |
---|
設計模式簡介總結 |
單例模式詳解 |
工廠方法模式 |
抽象工廠模式 |