Nội dung
- Tóm lại là
Thứ tư, 23/01/2019 | 00:00 GMT+7

Các mẫu hướng đối tượng JavaScript: Mẫu nhà máy


Mã tổ chức sẽ cứu ta khỏi rất nhiều đau đớn. Bằng cách sử dụng các tính năng của lập trình Hướng đối tượng , ta có thể sử dụng một số mẫu thiết kế nhất định để đạt được khả năng đọc tốt hơn, giảm dư thừa và tạo ra sự trừu tượng, nếu cần. Một trong những mô hình như vậy là mô hình nhà máy.

Mô hình nhà máy là một loại mô hình Hướng đối tượng tuân theo phương pháp DRY. Như tên cho thấy, các thể hiện đối tượng được tạo bằng cách sử dụng một nhà máy để tạo đối tượng cần thiết cho ta .

Hãy xem một ví dụ rất đơn giản về việc sử dụng mô hình nhà máy để lắp ráp một đối tượng alligator . Để làm được điều đó, trước tiên ta cần tạo các nhà máy production các bộ phận của alligator cho ta :

class TailFactory {
  constructor(props) {
    this.tailLength = props.tailLength;
  }
};

class TorsoFactory {
  constructor(props) {
    this.color = props.color;
  }
};

class HeadFactory {
  constructor(props) {
    this.snoutLenth = props.snoutLenth;
  }
};

Bây giờ, ta tạo một lớp đóng role trung gian giữa các lớp nhà máy thực tế và user . Hãy gọi đây là ReptilePartFactory :

class ReptilePartFactory {
  constructor(type, props) {
    if(type === "tail")
      return new TailFactory(props);
    if(type === "torso")
      return new TorsoFactory(props);
    if(type === "head")
      return new HeadFactory(props);
  }
};

Hãy tiếp tục và lắp ráp con cá sấu thật ngay bây giờ và sử dụng ReptilePartFactory để nhận các bộ phận cần thiết cho ta :

let alligator = {};
let alligatorProps = {
  tailLength : 2.5, 
  color: "green",
  snoutLenth: 1
};

//gets a tail from the tail factory
alligator.tail  = new ReptilePartFactory("tail", alligatorProps); 

//gets a torso from the torso factory
alligator.torso = new ReptilePartFactory("torso", alligatorProps);

//gets a head from the head factory
alligator.head  = new ReptilePartFactory("head", alligatorProps);

Hãy nhìn vào mô hình ở trên, có vẻ như ta có thể sử dụng cùng một ReptilePartFactory để tạo các bộ phận cho các vật thể giống cá sấu. Các nhà máy trong nền sẽ không bao giờ phải biết về bản chất của vật thể cuối cùng.

Vì vậy, sử dụng mô hình nhà máy mang lại cho ta những lợi thế nhất định:

  • Tạo đối tượng động : Nó được dùng trong trường hợp loại đối tượng được quyết định trong thời gian chạy.
  • Tính trừu tượng : User không bao giờ thực sự phải truy cập vào phương thức khởi tạo của đối tượng thực tế.
  • Khả năng tái sử dụng / Bảo trì : Các nhà máy tương tự được dùng cho các đối tượng tương tự và nó cho phép ta thêm / bớt các lớp đối tượng mới một cách dễ dàng mà không cần thay đổi nhiều mã.

Bây giờ ta đã có một số hiểu biết về factory pattern, hãy khám phá một chút về cách viết mã factory pattern tốt hơn.

Ví dụ trên sử dụng if-Ladder để tìm ra nhà máy nào cần gọi dựa trên thông tin đầu vào của user . Đây là một triển khai đơn giản, trực quan và không quá cởi mở với các thay đổi. Nếu ta có các phần mới để thêm vào sau này, thì ta sẽ phải làm phiền ReptilePartFactory . Điều này là vi phạm các nguyên tắc SOLID, trong đó nêu rõ "Các thực thể phần mềm (lớp, module , chức năng, v.v.) phải được mở để mở rộng, nhưng bị đóng để sửa đổi".

Làm thế nào về việc ta lưu trữ các lớp nhà máy trong một đối tượng và gọi là nhà máy production phần bắt buộc bằng cách sử dụng phần ta muốn làm khóa? Đầu tiên, ta phải đăng ký các nhà máy, nó sẽ đơn giản như sau:

let registeredPartFactories = {};
registeredPartFactories['tail'] = class TailFactory{
  ...
};

registeredPartFactories['torso'] = class TorsoFactory {
  ...
};

registeredPartFactories['head'] = class HeadFactory {
  ...
};

Và bây giờ, lớp trừu tượng có thể gọi các nhà máy như thế này:

class ReptilePartFactory {
  constructor(type, props) {
    return new registeredPartFactories[type](props);
  }
};

Cách tiếp cận này sạch hơn nhiều và cho phép mở rộng các nhà máy của ta mà không ảnh hưởng đến mã trong ReptilePartFactory .

Tóm lại là

Có một số mẫu hướng đối tượng khác cũng giúp tăng khả năng đọc và chất lượng. Vì vậy, trước khi sử dụng mô hình nhà máy, hãy kiểm tra xem có yêu cầu thực sự đối với nó hay không. Nếu bạn định tạo nhiều lần các loại đối tượng tương tự và cũng cần một lớp để tạo các thể hiện mới bằng cách sử dụng các đối tượng này trong khi cung cấp một số mức độ trừu tượng cho logic tạo, thì vâng - mẫu root là một lựa chọn tốt.


Tags:

Các tin liên quan

Đối tượng, Nguyên mẫu và Lớp trong JavaScript
2019-01-10
Thủ thuật với JavaScript Hủy cấu trúc
2018-11-26
Đừng sợ theo dõi JavaScript
2018-10-17
Làm phẳng mảng trong Vanilla JavaScript với flat () và flatMap ()
2018-09-28
Cách sử dụng các phương thức đối tượng trong JavaScript
2018-08-03
Xử lý lỗi trong JavaScript Sử dụng try ... catch
2018-08-03
Hiểu sự kiện trong JavaScript
2018-06-19
Lập lịch tác vụ trong JavaScript Sử dụng setTimeout & setInterval
2018-06-12
Hiểu các lớp trong JavaScript
2018-05-04
Truy cập API Rails trong ứng dụng khách JavaScript bằng Rails Ranger
2018-03-15