Паттерн Прототип (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()}`);
});