工廠方法模式
工廠方法模式(Factory Method Pattern)是一種建立型設計模式,它定義了一個用於建立物件的介面,但由子類決定要例項化的具體類。工廠方法模式將物件的建立委託給子類,從而實現了類的例項化延遲和高內聚低耦合的目標。
工廠方法模式的結構
工廠方法模式通常包含以下幾個角色:
- Product(產品介面或抽象類):
- 定義產品的公共介面,所有具體產品都應實現這個介面。
- ConcreteProduct(具體產品):
- 實現產品介面,提供具體的實現。
- Creator(抽象工廠類):
- 宣告工廠方法,用於返回一個
Product
物件。這個類通常是一個抽象類或介面,定義了產品的建立過程。
- ConcreteCreator(具體工廠類):
- 實現工廠方法,負責例項化具體的產品物件。不同的具體工廠會建立不同的具體產品。
工廠方法模式的優缺點
優點
- 解耦:客戶端不需要關心具體產品的建立過程,只需呼叫工廠方法獲取產品,降低了系統的耦合度。
- 統一管理物件建立: 工廠模式可以統一管理物件的建立過程,包括初始化、配置等操作,使得建立過程更加靈活和可控。
- 符合開閉原則:新增產品時,只需要建立新的具體產品類和工廠類,不需要修改現有程式碼。
- 靈活性:透過繼承和多型,子類可以決定建立哪種具體產品。
缺點
- 類的數量增加:為了支援不同型別的產品,必須建立多個具體工廠類,類的數量會增加。
- 可能增加系統複雜性:比簡單工廠模式要複雜,可能會使得系統變得更加難以理解和維護。
工廠方法模式的示例程式碼
假設我們有一個汽車生產工廠,工廠可以生產不同型別的汽車,例如BMW和Audi。
類圖
示例程式碼
產品介面和產品類
public interface Car {
void drive();
}
public class BMW implements Car {
@Override
public void drive() {
System.out.println("Driving a BMW car.");
}
}
public class Audi implements Car {
@Override
public void drive() {
System.out.println("Driving an Audi car.");
}
}
工廠相關的類
public abstract class CarFactory {
// 工廠方法,返回具體產品
public abstract Car createCar();
}
public class BMWFactory extends CarFactory {
@Override
public Car createCar() {
return new BMW(); // 返回具體的BMW物件
}
}
public class AudiFactory extends CarFactory {
@Override
public Car createCar() {
return new Audi(); // 返回具體的Audi物件
}
}
測試程式碼
public class Client {
public static void main(String[] args) {
// 使用工廠方法建立汽車
CarFactory factory = new BMWFactory(); // 透過BMW工廠建立BMW汽車
Car car = factory.createCar();
car.drive(); // 輸出:Driving a BMW car.
factory = new AudiFactory(); // 透過Audi工廠建立Audi汽車
car = factory.createCar();
car.drive(); // 輸出:Driving an Audi car.
}
}
測試結果
Driving a BMW car.
Driving an Audi car.
工廠方法模式的變體
除了傳統的工廠方法模式,有時在實際應用中還會使用一些變體:
-
抽象工廠模式:如果有多個產品族(即多個系列的產品),可以透過抽象工廠模式來實現每個工廠負責建立一組相關產品。與工廠方法模式的區別在於,工廠方法模式通常只涉及一個產品類的建立,而抽象工廠模式處理多個產品類的建立。
-
工廠方法和單例模式結合:工廠方法可以和單例模式結合使用,確保工廠例項和產品例項的唯一性。
總結
工廠方法模式是一種建立型設計模式,透過將物件的建立過程委託給子類來實現靈活的產品建立。相比於簡單工廠模式,工廠方法模式更加靈活,符合開閉原則,適用於需要擴充套件產品種類的場景,但也可能導致類數量增加。
工廠類提供某個產品的工廠方法來生產產品,隱藏物件的建立過程,使客戶端無需瞭解物件的具體建立邏輯,使得客戶端程式碼與具體類的解耦,減少了依賴,更容易維護和擴充套件。
-
物件的具體建立邏輯可以使用
反射
、動態代理
或者結合其他建立型設計模式
來完成物件的例項化; -
引入了“中間者”和麵向抽象程式設計使用了多型的特性,起到了解耦的作用;
-
使用者(客戶端)面向抽象(介面、抽象類)程式設計,而不直接依賴於具體產品類。
什麼是設計模式?
單例模式及其思想
設計模式--原型模式及其程式設計思想
掌握設計模式之生成器模式
掌握設計模式之簡單工廠模式
超實用的SpringAOP實戰之日誌記錄
2023年下半年軟考考試重磅訊息
透過軟考後卻領取不到實體證書?
計算機演算法設計與分析(第5版)
Java全棧學習路線、學習資源和麵試題一條龍
軟考證書=職稱證書?
軟考中級--軟體設計師毫無保留的備考分享