掌握設計模式之工廠方法模式

渊渟岳發表於2024-12-06

工廠方法模式

工廠方法模式(Factory Method Pattern)是一種建立型設計模式,它定義了一個用於建立物件的介面,但由子類決定要例項化的具體類。工廠方法模式將物件的建立委託給子類,從而實現了類的例項化延遲高內聚低耦合的目標。

工廠方法模式的結構

工廠方法模式通常包含以下幾個角色:

  1. Product(產品介面或抽象類)
  • 定義產品的公共介面,所有具體產品都應實現這個介面。
  1. ConcreteProduct(具體產品)
  • 實現產品介面,提供具體的實現。
  1. Creator(抽象工廠類)
  • 宣告工廠方法,用於返回一個Product物件。這個類通常是一個抽象類或介面,定義了產品的建立過程。
  1. ConcreteCreator(具體工廠類)
  • 實現工廠方法,負責例項化具體的產品物件。不同的具體工廠會建立不同的具體產品。

工廠方法模式的優缺點

優點

  • 解耦:客戶端不需要關心具體產品的建立過程,只需呼叫工廠方法獲取產品,降低了系統的耦合度。
  • 統一管理物件建立: 工廠模式可以統一管理物件的建立過程,包括初始化、配置等操作,使得建立過程更加靈活和可控。
  • 符合開閉原則:新增產品時,只需要建立新的具體產品類和工廠類,不需要修改現有程式碼。
  • 靈活性:透過繼承和多型,子類可以決定建立哪種具體產品。

缺點

  • 類的數量增加:為了支援不同型別的產品,必須建立多個具體工廠類,類的數量會增加。
  • 可能增加系統複雜性:比簡單工廠模式要複雜,可能會使得系統變得更加難以理解和維護。

工廠方法模式的示例程式碼

假設我們有一個汽車生產工廠,工廠可以生產不同型別的汽車,例如BMW和Audi。

類圖

image

示例程式碼

產品介面和產品類

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.

工廠方法模式的變體

除了傳統的工廠方法模式,有時在實際應用中還會使用一些變體:

  • 抽象工廠模式:如果有多個產品族(即多個系列的產品),可以透過抽象工廠模式來實現每個工廠負責建立一組相關產品。與工廠方法模式的區別在於,工廠方法模式通常只涉及一個產品類的建立,而抽象工廠模式處理多個產品類的建立。

  • 工廠方法和單例模式結合:工廠方法可以和單例模式結合使用,確保工廠例項和產品例項的唯一性。

總結

工廠方法模式是一種建立型設計模式,透過將物件的建立過程委託給子類來實現靈活的產品建立。相比於簡單工廠模式,工廠方法模式更加靈活,符合開閉原則,適用於需要擴充套件產品種類的場景,但也可能導致類數量增加。

工廠類提供某個產品的工廠方法來生產產品,隱藏物件的建立過程,使客戶端無需瞭解物件的具體建立邏輯,使得客戶端程式碼與具體類的解耦,減少了依賴,更容易維護和擴充套件。

  • 物件的具體建立邏輯可以使用反射動態代理或者結合其他建立型設計模式來完成物件的例項化;

  • 引入了“中間者”和麵向抽象程式設計使用了多型的特性,起到了解耦的作用;

  • 使用者(客戶端)面向抽象(介面、抽象類)程式設計,而不直接依賴於具體產品類。

image

什麼是設計模式?

單例模式及其思想

設計模式--原型模式及其程式設計思想

掌握設計模式之生成器模式

掌握設計模式之簡單工廠模式

超實用的SpringAOP實戰之日誌記錄

2023年下半年軟考考試重磅訊息

透過軟考後卻領取不到實體證書?

計算機演算法設計與分析(第5版)

Java全棧學習路線、學習資源和麵試題一條龍

軟考證書=職稱證書?

軟考中級--軟體設計師毫無保留的備考分享

相關文章