>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 공장 디자인 패턴

JavaScript의 공장 디자인 패턴

DDD
DDD원래의
2024-10-03 20:19:30550검색

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과 같은 클래스는 팩토리 메서드(VehicleFactory.createVehicle) 내부의 새 키워드를 사용하여 인스턴스화됩니다.
팩토리 패턴은 객체 생성을 추상화합니다. 즉, 클라이언트가 new 키워드 자체를 사용할 필요가 없습니다. 올바른 인스턴스를 반환하기 위해 팩토리 메서드를 사용합니다.

팩토리 패턴을 사용해야 하는 경우:

  • 런타임에 정확한 객체 유형을 결정해야 하는 경우
  • 객체 생성 로직을 중앙 집중화하고 싶을 때.
  • 작성 과정에 복잡한 논리나 여러 단계가 포함되는 경우

요약

  • Factory Design Pattern은 JavaScript에서 복잡하거나 다양한 객체 생성을 처리하는 데 유용한 방법입니다.
  • 인스턴스화 논리를 추상화하여 다양한 객체 유형을 유연하고 쉽게 관리할 수 있습니다.
  • 이 패턴은 실제 애플리케이션에서 널리 사용되며, 특히 객체 생성이 런타임 조건이나 구성에 따라 달라질 수 있는 복잡한 시스템에서 작업할 때 더욱 그렇습니다.
  • 실제 프로젝트에서 코드가 발전하고 더욱 복잡해짐에 따라 팩토리 함수 접근 방식은 필요한 변경 수를 최소화하여 코드를 더 유지 관리하기 쉽고 리팩터링하기 쉽게 만듭니다.

참고 도서: Mario Casciaro의 NodeJs 디자인 패턴

살펴본 것처럼 디자인 패턴은 일반적인 소프트웨어 디자인 과제를 효율적으로 해결하는 데 중요한 역할을 합니다. 저처럼 이제 막 시작하는 분이든, 더 깊은 이해를 원하는 분이든 여기에서 공유한 통찰력은 보다 적응력 있고 확장 가능한 시스템을 구축하는 데 도움이 될 수 있습니다.

디자인 패턴을 마스터하기 위한 여정은 처음에는 부담스러울 수 있지만, 작게 시작하여 실험하고 이러한 개념을 실제 프로젝트에 적용함으로써 개발자로서의 기술을 강화할 수 있습니다. 이제 당신 차례입니다! 이러한 아이디어를 작업에 어떻게 적용하시겠습니까? 아래 댓글로 여러분의 생각이나 질문을 공유해 주세요. 여러분의 의견을 듣고 싶습니다.

이 배움의 여정에 동참해주셔서 감사합니다!
✨✨✨✨✨✨

위 내용은 JavaScript의 공장 디자인 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:유동장 화면다음 기사:유동장 화면