Перейти к основному содержимому

Паттерн "Прототип" (Prototype) в Java — копирование вместо создания с нуля

Разработчику Архитектору
Теория данных (раздел 3)

Обзор паттерна — в порождающих паттернах. Здесь — практический Prototype на Java для объектов с дорогой инициализацией.

Play ITЗагрузка интерактивного демо…


Задача паттерна

Prototype позволяет создавать новый объект копированием существующего, без повторной полной инициализации.

Подходит, когда:

  • конструктор тяжелый (загрузка шаблонов, конфигов, внешних ресурсов);
  • объекты отличаются только состоянием;
  • нужно быстро тиражировать заготовки.

Пример — прототип отчета

Код ITЗагрузка примера кода…

Report prototype = new SalesReport();

Report report1 = prototype.clone();
Report report2 = prototype.clone();
report2.settings.put("period", "Q2");

Shallow copy и Deep copy

Тип копииЧто копируется
ShallowПримитивы и ссылки (вложенные объекты общие)
DeepНовые экземпляры вложенных изменяемых объектов

В примере выше settings копируется глубоко относительно Map, чтобы изменения в одном отчете не влияли на другие.


Альтернативы clone()

  • copy constructor: new Report(existing)
  • статический метод: Report.copy(existing)
  • сериализация (реже, обычно дороже по CPU)

Во многих командах Java предпочитают явные copy-constructor методы, потому что Cloneable и clone() исторически считаются не самым удобным API.


См. также