Паттерн Прототип (Prototype) - описание

Ниже будет описание паттрена на основе стандартных разделов.

Название и классификация

Прототип - паттерн, ( относится к типу порождающих паттернов)

Назначение

Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.

Псевдоним

Пседонима нет - называйте по имени -"Протипом" =))

Мотивация

Применимость

Используйте паттерн прототип, когда система не должна зависеть от того, как
в ней создаются, компонуются и представляются продукты:

  1. инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
  2. для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
  3. экземпляры класса могут находиться в одном из не очень большого числа различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.

Структура

Участники

  1. Prototype(Graphic) прототип: объявляет интерфейс для клонирования самого себя;
  2. ConcretePrototype (например - нотный стан, целая нота, половинная нота) конкретный прототип: реализует операцию клонирования себя;
  3. Client(GraphicTool) клиент: создает новый объект, обращаясь к прототипу с запросом клонировать себя.

Отношения

Клиент обращается к прототипу, чтобы тот создал свою копию (запрашивает копию)

Результаты

те же самые результаты, что у абстрактной фабрики и строителя: скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен.

также имеются такие "плюсы":

  1. добавление и удаление продуктов во время выполнения
  2. спецификация новых объектов путем изменения значений
  3. специфицирование новых объектов путем изменения структуры
  4. уменьшение числа подклассов
  5. динамическое конфигурирование приложения классами

Недостатки

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

Реализация

Пример кода

Рассмотрим реализацию паттерна прототип на языке PHP

Известные применения

Родственные паттерны

В некоторых отношениях прототип и абстрактная фабрика являются конкурентами.

Но их используют и совместно. Абстрактная фабрика может хранить набор прототипов, которые клонируются и возвращают изготовленные объекты. В тех проектах, где активно применяются паттерны компоновщик и декоратор, тоже можно извлечь пользу из прототипа