Prototype Pattern

Паттерн Прототип для создания объектов путем клонирования существующих экземпляров

Паттерн Прототип (Prototype Pattern) позволяет создавать новые объекты путем клонирования существующих экземпляров (прототипов), вместо создания объектов с нуля. Это особенно полезно, когда создание объекта дорого по ресурсам или когда нужно создавать множество похожих объектов с небольшими вариациями.

В примере ниже класс ToyotaCar имеет метод produce(), который создает копию текущего объекта. Создается прототипный объект с базовыми характеристиками, а затем из него клонируются новые экземпляры, которые можно кастомизировать независимо друг от друга. Это экономит ресурсы и упрощает создание похожих объектов.

class ToyotaCar {
  constructor(model, price, interior, autopilot) {
    this.model = model;
    this.price = price;
    this.interior = interior;
    this.autopilot = autopilot;
  }

  // Метод для клонирования объекта (прототип)
  produce() {
    return new ToyotaCar(this.model, this.price, this.interior, this.autopilot);
  }

  getInfo() {
    return `${this.model} - $${this.price}, interior: ${this.interior}, autopilot: ${this.autopilot}`;
  }
}

// Создаем прототипный объект с базовыми характеристиками
const prototypeCar = new ToyotaCar('Camry', '30000$', 'red', false);

// Клонируем прототип для создания новых экземпляров
const car1 = prototypeCar.produce();
console.log(car1.getInfo());
// "Camry - $30000$, interior: red, autopilot: false"

// Клонируем и кастомизируем второй автомобиль
const car2 = prototypeCar.produce();
car2.autopilot = true;
car2.interior = 'white';
console.log(car2.getInfo());
// "Camry - $30000$, interior: white, autopilot: true"

// Клонируем и кастомизируем третий автомобиль
const car3 = prototypeCar.produce();
car3.model = 'Camry 2018';
car3.price = '32000$';
console.log(car3.getInfo());
// "Camry 2018 - $32000$, interior: red, autopilot: false"

// Прототип остается неизменным
console.log(prototypeCar.getInfo());
// "Camry - $30000$, interior: red, autopilot: false"

// Создание массива автомобилей из прототипа
const cars = [];
for (let i = 0; i < 5; i++) {
  const car = prototypeCar.produce();
  car.price = `${30000 + i * 1000}$`;
  cars.push(car);
}

console.log(`Created ${cars.length} cars from prototype`);
cars.forEach((car, index) => {
  console.log(`Car ${index + 1}: ${car.getInfo()}`);
});