Prototype Design Pattern là một mẫu thiết kế cho phép bạn sao chép các đối tượng mà không cần phải tạo lại chúng từ đầu. Mẫu này rất hữu ích khi bạn muốn tạo ra các đối tượng mới từ một đối tượng đã tồn tại mà không cần phải biết chi tiết cách chúng được tạo ra.

Dưới đây là cách triển khai Prototype Design Pattern trong JavaScript với ví dụ minh họa:

Bước 1: Tạo Prototype

Đầu tiên, chúng ta sẽ định nghĩa một đối tượng prototype mà các đối tượng mới sẽ kế thừa từ đó.

Bước 2: Tạo hàm sao chép (clone)

Hàm này sẽ sao chép các thuộc tính của đối tượng prototype để tạo ra các đối tượng mới.

Bước 3: Sử dụng Prototype Pattern

Dưới đây là một triển khai hoàn chỉnh:

// Prototype
const carPrototype = {
    init(model, year) {
        this.model = model;
        this.year = year;
    },
    getInfo() {
        return `${this.year} ${this.model}`;
    },
    clone() {
        const clone = Object.create(this);
        clone.init(this.model, this.year);
        return clone;
    }
};

// Sử dụng Prototype
const car1 = Object.create(carPrototype);
car1.init("Toyota Camry", 2020);

const car2 = car1.clone(); // Tạo một bản sao của car1
car2.init("Honda Accord", 2021); // Thay đổi thông tin cho bản sao

console.log(car1.getInfo()); // In ra "2020 Toyota Camry"
console.log(car2.getInfo()); // In ra "2021 Honda Accord"

Giải thích mã

  1. Prototype: Chúng ta tạo một đối tượng carPrototype với các thuộc tính và phương thức như init, getInfo, và clone.
    • init: Phương thức này dùng để khởi tạo thông tin cho đối tượng.
    • getInfo: Phương thức này trả về thông tin của xe.
    • clone: Phương thức này tạo ra một bản sao mới của đối tượng dựa trên prototype.
  2. Sử dụng Prototype:
    • Sử dụng Object.create(carPrototype) để tạo ra đối tượng car1 dựa trên prototype.
    • Gọi init để khởi tạo các thuộc tính cho car1.
    • Sử dụng car1.clone() để tạo ra car2, một bản sao của car1.
    • Thay đổi thông tin cho car2 bằng cách gọi init với các tham số mới.

Kết luận

Prototype Design Pattern cho phép bạn tạo ra các đối tượng mới một cách nhanh chóng từ các đối tượng đã tồn tại mà không cần phải xây dựng lại từ đầu. Điều này có thể giúp giảm thiểu việc sử dụng bộ nhớ và tăng cường hiệu suất. Mẫu này cũng rất hữu ích khi bạn muốn các đối tượng có một số thuộc tính chung nhưng cũng cần có những thuộc tính riêng biệt.