Паттерн «Прототип»
Шаблон «Прототип» используется для создания дублирующихся объектов, обеспечивая при этом производительность. Этот тип шаблонов проектирования относится к порождающим шаблонам и предоставляет один из лучших способов создания объектов.
Этот шаблон реализует интерфейс прототипа, который используется для создания клона текущего объекта. Этот шаблон применяется, когда прямое создание объекта относительно затратно. Например, объект должен быть создан после дорогостоящей операции с базой данных. Мы можем кэшировать объект, возвращать его клон при следующем запросе и при необходимости обновлять базу данных, тем самым сокращая количество обращений к базе данных.
summary
Паттерн «Прототип»
назначение: Используйте экземпляры прототипа, чтобы указать виды создаваемых объектов, и создавайте новые объекты путем копирования этих прототипов.
В основном решает: Динамически создавать и удалять прототипы во время выполнения.
Когда использовать
- Система не зависит от создания, композиции и представления продуктов.
- Класс для создания экземпляра должен быть указан во время выполнения, например, посредством динамической загрузки.
- Избегайте создания иерархии классов фабрик, параллельной иерархии классов продуктов.
- Экземпляры класса могут иметь лишь несколько различных комбинаций состояний; клонирование прототипа удобнее ручного создания экземпляров.
Как решить
Быстро создавать экземпляр, идентичный объекту-прототипу, используя существующий объект-прототип.
Ключевой код
- Реализуйте операцию clone:
- В Java реализуйте
CloneableИнтерфейс, переопределитьclone()метод. - В .NET используйте
ObjectКлассMemberwiseClone()Метод реализует поверхностное копирование или глубокое копирование через сериализацию.
- В Java реализуйте
- Изолируйте связь между пользователями объектов классов и конкретными типами, требуя, чтобы "volatile classes" имели стабильные интерфейсы.
Пример приложения
- Деление клетки
- На Java
Object.clone()Методы
Преимущества
- Повышение производительности
- Избегание ограничений конструктора
Недостатки
- Оснащение класса методами clone требует всестороннего учёта функциональности класса, что может быть сложно для существующих классов, особенно при работе с косвенными объектами, не поддерживающими сериализацию, или ссылками, содержащими циклические структуры.
- Обязательная реализация
CloneableИнтерфейс.
Сценарий использования
- Оптимизация ресурсов
- Когда инициализация класса потребляет большой объём ресурсов (таких как данные, аппаратные ресурсы).
- Сценарии с высокими требованиями к производительности и безопасности
- Через
newКогда создание объекта требует сложной подготовки данных или прав доступа. - Объект требует нескольких модификаторов
- Когда объект нужно предоставить другим объектам для доступа, и он может быть изменён различными вызывающими сторонами.
- Часто используется вместе с паттерном фабричного метода, посредством
cloneсоздания объектов, которые затем предоставляются вызывающим сторонам фабричным методом.
Примечания
В отличие от прямого создания экземпляра класса для создания нового объекта, паттерн Прототип создаёт новые объекты путём копирования существующих объектов. Поверхностное копирование достигается путём реализацииCloneableтогда как глубокое копирование достигается путём реализацииSerializableчтения двоичных потоков.
Структура
Паттерн прототип включает следующие основные роли:
Интерфейс прототипа: Определяет интерфейс для клонирования самого себя, обычно включающий
clone()метод.Конкретный прототип: Конкретный класс, который реализует интерфейс прототипа и отвечает за фактическую операцию клонирования. Этот класс должен реализовать
clone()метод, обычно используя поверхностное или глубокое копирование для копирования самого себя.Клиент: использует экземпляры прототипа для создания новых объектов. Клиент вызывает у объекта-прототипа
clone()метод для создания новых объектов вместо прямого использования конструкторов.
Реализация
Мы создадим абстрактный классShapeи расширяющиеShapeконкретные классы этого класса. Следующий шаг — определить классShapeCache, этот класс хранит объекты фигур вHashtableи возвращает их клоны по запросу.
PrototypePatternDemoКласс используетShapeCacheкласс для полученияShapeобъекта.
Шаг 1
Создайте абстрактный класс, которыйCloneableреализует интерфейс.
Shape.java
Шаг 2
Создайте классы сущностей, расширяющие вышеуказанный абстрактный класс.
Rectangle.java
Square.java
Circle.java
Шаг 3
Создайте класс, который извлекает классы сущностей из базы данных и сохраняет их вHashtableВ.
ShapeCache.java
Шаг 4
PrototypePatternDemoИспользованиеShapeCacheкласс для получения прототипа, хранящегося вHashtableклона фигуры внутри.
PrototypePatternDemo.java
Шаг 5
Запустите программу, выведите результат:
Shape : Circle Shape : Square Shape : RectangleДругие расширения