Evgenii Legotckoi
19 сентября 2018 г. 20:27

Порождающие шаблоны проектирования - Прототип

Цели

  • Указать типы объектов для создания с использованием экземпляра прототипа и создать новые объекты, скопировав этот прототип.
  • Coздать один экземпляр класса для использования в качестве исходника всех будущих экземпляров.
  • Оператор new считается вредным

Проблематика

Приложение имеет жёсткую привязку к классу объекта при использовании оператора new.


Обсуждение

Объявите абстрактный базовый класс, который определяет чистый виртуальный метод «clone» и поддерживает словарь всех «клонируемых» конкретных производных классов. Любой класс, который нуждается в возможности «полиморфного конструктора»: извлекается из абстрактного базового класса, регистрирует его прототипический экземпляр и реализует операцию clone().

Затем клиент вместо того, чтобы писать код, который вызывает оператор new по имени производного класса, вызывает операцию «clone» в абстрактном базовом классе, предоставляя строковый или нумерованный тип данных, который обозначает конкретный желаемый производный класс.

Структура

Фабрика знает, как найти правильный прототип, и каждый Класс знает, как порождать новые экземпляры самого себя.

Пример

Шаблон Prototype указывает тип объектов, создаваемых с использованием прототипа. Прототипы новых продуктов часто строятся до полного производства, но в этом примере прототип является пассивным и не участвует в копировании. Митотическое деление клетки, приводящее к двум идентичным клеткам, является примером прототипа, который играет активную роль в копировании и, таким образом, демонстрирует образец прототипа. Когда клетка расщепляется, появляются две клетки идентичного генотипа. Другими словами, клетка сама себя клонирует.

Контрольный список

  1. Добавить метод "clone" к существующей иерархии классов
  2. Создайте «реестр», который поддерживает кеш прототипических объектов. Реестр может быть инкапсулирован в новый класс Factory или в базовый класс.
  3. Создайте фабричный метод, который: может (или может быть нет) принимать аргументы, находить правильный объект-прототип, вызывать clone() для этого объекта и возвращать результат.
  4. Клиент заменяет все вызовы оператора new вызовами заводского метода.

Эмпирические правила

  • Иногда шаблонами создания являются конкуренты: бывают случаи, когда можно использовать Prototype или Abstract Factory. В других случаях они дополняют друг друга: Abstract Factory может хранить набор прототипов, из которых можно клонировать и возвращать объекты. Abstract Factory, Builder и Prototype могут использовать Singleton в своих реализациях.
  • Классы Abstract Factory часто реализуются с помощью Factory Methods, но они могут быть реализованы с использованием Prototype.
  • Фабричный метод: создание через наследование. Прототип: создание через делегирование.
  • Часто проекты начинаются с использования Factory Method (менее сложные, настраиваемые, подклассы размножаются) и развиваются в направлении Abstract Factory, Prototype или Builder (более гибкие, более сложные), поскольку разработчик обнаруживает, что требуется больше гибкости.
  • Прототип не требует подклассов, но для этого требуется операция «initialize». Фабричный метод требует подклассификации, но не требует инициализации.
  • Конструкции, которые часто используют шаблоны Composite и Decorator, часто могут также использовать Prototype.
  • Прототип создаёт один экземпляр класса для использования в качестве создателя всех будущих экземпляров.
  • Прототипы полезны, когда инициализация объектов стоит дорого, и вы ожидаете незначительных изменений параметров инициализации. В этом контексте Prototype может избежать дорогостоящего «создания с нуля» и поддерживать дешевое клонирование предварительно инициализированного прототипа.
  • Прототип уникален среди других шаблонов создания, поскольку для него не требуется класс - только объект. Объектно-ориентированные языки, такие как Self и Omega, которые устраняют классы, полностью полагаются на прототипы для создания новых объектов.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 ноября 2024 г. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…