首頁 > web前端 > js教程 > 主體

JavaScript 中的工廠設計模式

DDD
發布: 2024-10-03 20:19:30
原創
505 人瀏覽過

Factory Design Pattern in JavaScript

工廠設計模式是一種建立型設計模式,它提供了一種建立物件的方法,而無需指定將要建立的物件的確切類別。它涉及創建一個工廠方法,該方法根據輸入或配置決定要實例化哪個類別。當我們需要將所有物件創建及其業務邏輯保留在一個地方時使用它。

工廠設計模式的主要優點是能夠將物件的建立與特定的實作解耦。
它允許創建其類別在運行時確定的物件。
工廠允許我們暴露一個比類小得多的“表面積”,類別可以擴展、操作,而工廠只是一個函數,為用戶提供的選項更少,使其更加健壯。
因此,工廠還可以透過利用閉包來強制封裝。

一種施加封裝的方法

在 Javascript 中,強制封裝的主要方法之一是透過函數作用域和閉包。

工廠也可以用作封裝機制。

封裝是指透過阻止外部程式碼直接操作元件的一些內部細節來控制對它們的存取。與元件的互動僅透過其公共介面進行,從而將外部程式碼與元件實作細節的變更隔離開來。

閉包可讓您建立無法從工廠外部存取的私有變數和方法,從而強制封裝並隱藏物件建立和實作的內部細節。

解耦物件的創建和實現

呼叫工廠,而不是使用 new 運算子或 Object.create() 直接從類別建立新對象,在多個方面更加方便和靈活。

工廠允許我們將物件的創建與實作分開。工廠包裝了新實例的創建,為我們提供了更多的靈活性和控制方式。在工廠內部,我們選擇使用 new 運算子建立類別的新實例,或利用閉包動態建構有狀態物件文字,甚至根據特定條件傳回不同的物件類型。工廠的消費者完全不知道實例的創建是如何進行的。

讓我們透過一個小例子來理解為什麼我們需要工廠設計模式

function createImg(name) {
    return new Image(name);
}

const image = createImg('photo.jpg');
登入後複製

你可能會說為什麼要多寫這行程式碼,而我們可以直接寫:

const image = new Image(name);
登入後複製

所以使用工廠函數(createImg)背後的想法是抽象創建物件的過程。

重構中工廠函數的好處:

單點變更:透過使用工廠函數,您可以集中物件建立流程。重構或擴充邏輯需要在一個地方進行更改,而不是整個程式碼庫。

簡化客戶端程式碼:即使物件建立過程的複雜性增加,使用工廠函數的客戶端程式碼也保持不變。

封裝:工廠函數封裝任何附加邏輯(例如快取、預設參數或新物件類型)。這可以防止多個地方的邏輯重複,並降低重構過程中出錯的風險。

可維護性:隨著程式碼的成長,維護工廠函數變得比重構直接實例化容易得多。使用工廠函數,您可以引入新功能、進行最佳化或修復錯誤,而不會影響其餘程式碼。

例子

這是在 JavaScript 實現工廠設計模式的基本範例:
場景:根據輸入建立不同類型車輛(汽車、自行車、卡車)的工廠。

// Vehicle constructor functions
class Car {
  constructor(brand, model) {
    this.vehicleType = 'Car';
    this.brand = brand;
    this.model = model;
  }

  drive() {
    return `Driving a ${this.brand} ${this.model} car.`;
  }
}

class Bike {
  constructor(brand, model) {
    this.vehicleType = 'Bike';
    this.brand = brand;
    this.model = model;
  }

  ride() {
    return `Riding a ${this.brand} ${this.model} bike.`;
  }
}

class Truck {
  constructor(brand, model) {
    this.vehicleType = 'Truck';
    this.brand = brand;
    this.model = model;
  }

  haul() {
    return `Hauling with a ${this.brand} ${this.model} truck.`;
  }
}

// Vehicle factory that creates vehicles based on type
class VehicleFactory {
  static createVehicle(type, brand, model) {
    switch (type) {
      case 'car':
        return new Car(brand, model);
      case 'bike':
        return new Bike(brand, model);
      case 'truck':
        return new Truck(brand, model);
      default:
        throw new Error('Vehicle type not supported.');
    }
  }
}

// Using the factory to create vehicles
const myCar = VehicleFactory.createVehicle('car', 'Tesla', 'Model 3');
console.log(myCar.drive()); // Output: Driving a Tesla Model 3 car.

const myBike = VehicleFactory.createVehicle('bike', 'Yamaha', 'MT-15');
console.log(myBike.ride()); // Output: Riding a Yamaha MT-15 bike.

const myTruck = VehicleFactory.createVehicle('truck', 'Ford', 'F-150');
console.log(myTruck.haul()); // Output: Hauling with a Ford F-150 truck.

登入後複製

工作原理:

  1. 車輛類別:我們定義不同類型的車輛(汽車、自行車、卡車),每種類型都有自己的構造函數和特定方法,如drive()、ride() 和haul()。
  2. 工廠方法:VehicleFactory.createVehicle()方法是處理建立物件邏輯的工廠。它根據傳遞給它的類型參數決定要實例化哪種類型的車輛。
  3. 可重用性:工廠集中了創建車輛的邏輯,可以輕鬆管理、擴展或修改創建過程。

Ps:在上面的工廠設計模式範例中,像 Car、Bike 和 Truck 這樣的類別是使用工廠方法中的 new 關鍵字 (VehicleFactory.createVehicle) 實例化的
工廠模式抽象化了物件創建,這意味著客戶端不必自己使用 new 關鍵字。他們依靠工廠方法傳回正確的實例。

何時使用工廠模式:

  • 當需要在運行時確定物件的確切類型時。
  • 當你想要集中物件建立邏輯。
  • 當創作過程涉及複雜邏輯或多步驟時。

概括

  • 工廠設計模式是處理 JavaScript 中複雜或多樣的物件創建的有用方法。
  • 它抽象化了實例化邏輯,允許靈活且更輕鬆地管理不同的物件類型。
  • 這種模式廣泛應用於現實世界的應用程式中,特別是在使用物件建立可能取決於執行時間條件或配置的複雜系統時。
  • 在現實世界的專案中,隨著您的程式碼不斷發展並變得更加複雜,工廠函數方法可以最大限度地減少您需要進行的變更數量,使您的程式碼更易於維護且更易於重構。

參考書:Mario Casciaro 的 NodeJs 設計模式

正如我們所探索的,設計模式在有效解決常見軟體設計挑戰方面發揮著至關重要的作用。無論您是像我一樣剛開始,還是希望加深理解,這裡分享的見解都可以幫助您建立更具適應性和可擴展性的系統。

掌握設計模式的旅程一開始可能會讓人感到不知所措,但透過從小事做起、進行實驗並將這些概念應用到實際專案中,您將增強您作為開發人員的技能。現在輪到你了!您將如何將這些想法應用到您的工作中?在下面的評論中分享您的想法或問題 - 我很樂意聽取您的意見。

感謝您加入我的學習之旅!
✨✨✨✨✨✨

以上是JavaScript 中的工廠設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!