Паттерн "Прототип" (Prototype) в Java — копирование вместо создания с нуля
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Обзор паттерна — в порождающих паттернах. Здесь — практический 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.