Skip to content

Prototype

Pandas edited this page Jun 16, 2017 · 2 revisions

Прототип — паттерн, порождающий объекты.

Назначение:

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

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

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

Структура:

Imgur

Участники:

  • Prototype — прототип: объявляет интерфейс для клонирования самого себя;
  • ConcretePrototype — конкретный прототип: реализует операцию клонирования себя;
  • Client — клиент: создает новый объект, обращаясь к прототипу с запросом клонировать себя.

Результаты:

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

Дополнительные преимущества:

  • Добавление и удаление продуктов во время выполнения;
  • Спецификация новых объектов путем изменения значений;
  • Специфицирование новых объектов путем изменения структуры;
  • Уменьшение числа подклассов;
  • Динамическое конфигурирование приложения классами.

Недостатки:

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

Clone this wiki locally