Java工廠方法模式詳解
一、概念介紹
1. 什么是工廠方法模式?
工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它允許定義一個接口或抽象類來創建對象,但將實際對象的實例化延遲到子類中實現。工廠方法模式通過定義一個用于創建對象的接口,讓子類決定實例化哪一個類,從而實現對象的創建與使用分離,提高系統的靈活性和可擴展性。
2. 角色組成
工廠方法模式主要由以下四個角色組成:
1)抽象工廠(Creator):聲明一個用于創建對象的工廠方法,該方法是一個抽象方法,由子類實現。
2)具體工廠(Concrete Creator):實現了抽象工廠接口,含有與應用相關的邏輯,用于創建具體的產品對象。
3)抽象產品(Product):定義了產品的接口,是工廠方法所創建對象的超類型,即工廠方法返回的對象類型。
4)具體產品(Concrete Product):實現了抽象產品接口的具體類,是被具體工廠創建的對象。
3. 特點
- 延遲實例化:將對象的實例化延遲到子類中實現。
- 符合開閉原則:新增產品時,只需新增相應的具體工廠類,無需修改原有代碼。
- 降低耦合:客戶端只依賴于抽象工廠接口和產品接口,降低了客戶端與具體產品的耦合度。
二、使用場景與優缺點
1. 使用場景
工廠方法模式適用于以下場景:
- 需要創建的對象類型在編譯時不確定:例如,根據不同的配置或輸入參數創建不同類型的對象。
- 系統需要擴展,且不希望修改現有代碼:新增產品時,只需新增具體工廠類,無需修改現有代碼。
- 創建對象的過程復雜,且需要隱藏具體創建邏輯:將對象的創建過程封裝在工廠類中,客戶端無需關心創建細節。
2. 優點
- 良好的封裝性:隱藏了對象創建的細節,客戶端只需通過接口操作對象。
- 優秀的可擴展性:新增產品時,只需新增具體工廠類,符合開閉原則。
- 降低耦合度:客戶端只依賴于抽象接口,降低了與具體實現的耦合。
3. 缺點
- 類的數量增加:針對每一種產品都需要定義一個具體工廠類,隨著產品種類的增加,類的數量也相應增加。
- 產品族擴展困難:當需要新增產品族時,可能需要修改多個具體工廠類,影響系統的擴展性。
三、Java實現示例
以下是一個使用Java實現的工廠方法模式示例,模擬了一個簡單的汽車制造場景。
1. 抽象產品接口(Car)
下面是一個抽象產品接口,它定義了產品對象的公共接口。在這個例子中,Car接口有一個run方法,用于描述汽車運行的行為。
public interface Car {void run();
}
2. 具體產品實現類
Benz和BMW是實現了Car接口的具體產品類。它們分別提供了run方法的具體實現,用于描述不同品牌汽車的運行行為。
public class Benz implements Car {@Overridepublic void run() {System.out.println("Benz is running."); }}
public class BMW implements Car {@Overridepublic void run() {System.out.println("BMW is running.");}}
3. 抽象工廠接口(CarFactory)
下面是一個抽象工廠接口,它聲明了工廠方法createCar,該方法返回一個Car類型的對象。抽象工廠接口是工廠方法模式的核心,它允許系統在不直接指定具體產品類的情況下創建對象。
public interface CarFactory {Car createCar();
}
4. 具體工廠類
BenzFactory 和 BMWFactory 是實現了 CarFactory 接口的具體工廠類。它們分別重寫了 createCar 方法,用于創建并返回具體的產品對象(Benz或BMW)。
public class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new Benz();}}
public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMW();}}
5. 客戶端
客戶端通過工廠類來創建產品對象,而不是直接通過new關鍵字。這種方式使得客戶端代碼與具體產品類的實現解耦,提高了系統的靈活性和可擴展性。當需要添加新的產品類時,只需添加相應的具體產品類和具體工廠類,而無需修改客戶端代碼。
public class Client {public static void main(String[] args) {CarFactory benzFactory = new BenzFactory(); Car benz = benzFactory.createCar(); benz.run(); CarFactory bmwFactory = new BMWFactory(); Car bmw = bmwFactory.createCar(); bmw.run(); }}
運行結果:
Benz is running.
BMW is running.
結束語
工廠方法設計模式通過引入工廠等級結構,允許系統在不直接指定具體產品類的情況下創建對象。它通過將對象的創建過程封裝在工廠類中,使得客戶端代碼與具體產品類的實現解耦,提高了系統的靈活性和可擴展性。同時,它也遵循了開閉原則,即軟件實體應該對擴展開放,對修改關閉。但也存在類數量增加和產品族擴展困難等缺點。
在實際應用中,應根據具體需求選擇合適的設計模式,以提高代碼的可維護性和可擴展性。通過工廠方法模式,Java開發者可以更靈活地管理對象的創建過程,從而編寫出更加健壯和易于維護的代碼。
簡單動作,深刻聯結。在這技術海洋,我備好舟,等你揚帆。啟航吧!
🌟點擊【關注】,解鎖定期的技術驚喜,讓靈感與知識的源泉不斷涌動。
👍一個【點贊】,如同心照不宣的默契,是我們共同語言的閃亮印記。
📚【收藏】好文,搭建你的專屬智慧庫,讓每次回望都能照亮新知之路。
源碼地址:https://gitee.com/code-in-java/csdn-blog.git