Что такое паттерн "Прототип" (Prototype)

Прототип — это порождающий паттерн проектирования, который позволяет создавать новые объекты путём клонирования уже существующих, вместо создания объектов «с нуля». Это удобно, когда процесс создания нового объекта сложный или ресурсоёмкий.

Представьте, что у вас есть объект с определёнными настройками или состоянием, и вам нужно создать его копию с минимальными изменениями. Вместо того чтобы создавать объект заново, вы клонируете существующий прототип и изменяете необходимые поля.

Преимущества паттерна «Прототип»

  • Быстрое создание новых объектов за счёт клонирования.
  • Позволяет избежать затрат на создание объекта с нуля.
  • Удобен для объектов с большим числом параметров.

Пример:

  • Есть базовый объект-прототип.
  • Новые объекты создаются через его клонирование.
  • Клонирование может быть поверхностным или глубоким.

Где применяется паттерн «Прототип»?

  • Системы, где требуется создавать много похожих объектов.
  • Игры для копирования персонажей, объектов сцены.
  • В случаях, когда создание объекта дорогостоящие или сложное.

Пример реализации на JavaScript

// Пример базового объекта-прототипа class Car { constructor(model, engine) { this.model = model; this.engine = engine; } clone() { // Простое поверхностное клонирование return new Car(this.model, this.engine); } } // Использование const originalCar = new Car("Tesla Model S", "Electric"); const clonedCar = originalCar.clone(); clonedCar.model = "Tesla Model X"; console.log(originalCar); // Car { model: 'Tesla Model S', engine: 'Electric' } console.log(clonedCar); // Car { model: 'Tesla Model X', engine: 'Electric' }

Когда стоит использовать паттерн «Прототип»?

  • Когда создание нового объекта «с нуля» дорогостоящее или сложное.
  • Нужно создавать много похожих объектов с небольшими отличиями.
  • Желаете динамически выбирать тип создаваемого объекта путём клонирования.

Отличие от других паттернов

  • В отличие от фабричных методов, прототип создаёт объект клонированием, а не через конструктор.
  • В отличие от строителя, прототип не пошагово строит объект, а просто копирует.

Плюсы паттерна

  • Ускоряет создание новых объектов.
  • Упрощает создание сложных объектов с большим числом параметров.
  • Позволяет создавать копии без привязки к конкретным классам.

Минусы паттерна

  • Поверхностное клонирование может вызвать проблемы с изменяемыми вложенными объектами.
  • Реализация глубокого клонирования может быть сложной.
  • Может усложнить архитектуру из-за необходимости поддержки методов клонирования.