Паттерн "Прототип" (Prototype) в Java — копирование вместо создания с нуля
Обзор паттерна — в порождающих паттернах. Здесь — практический Prototype на Java для объектов с дорогой инициализацией.
Задача паттерна
Prototype позволяет создавать новый объект копированием существующего, без повторной полной инициализации.
Подходит, когда:
- конструктор тяжелый (загрузка шаблонов, конфигов, внешних ресурсов);
- объекты отличаются только состоянием;
- нужно быстро тиражировать заготовки.
Пример — прототип отчета
import java.util.HashMap;
import java.util.Map;
abstract class Report implements Cloneable {
protected String template;
protected DatabaseConnection dbConnection;
protected Map<String, Object> settings;
protected Report() {
this.dbConnection = new DatabaseConnection();
this.settings = loadDefaultSettings();
}
protected Map<String, Object> loadDefaultSettings() {
Map<String, Object> defaults = new HashMap<>();
defaults.put("period", "Q1");
defaults.put("format", "pdf");
return defaults;
}
@Override
public Report clone() {
try {
Report cloned = (Report) super.clone();
cloned.settings = new HashMap<>(this.settings);
return cloned;
} catch (CloneNotSupportedException e) {
throw new IllegalStateException(e);
}
}
abstract void generate();
}
class SalesReport extends Report {
@Override
void generate() {
System.out.println("Генерация отчета по продажам");
}
}
final class DatabaseConnection {
}
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.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#