Паттерн Прототип (Prototype) - описание
Primary tabs
Forums:
Ниже будет описание паттрена на основе стандартных разделов.
Название и классификация
Прототип - паттерн, ( относится к типу порождающих паттернов)
Назначение
Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.
Псевдоним
Пседонима нет - называйте по имени -"Протипом" =))
Мотивация
Применимость
Используйте паттерн прототип, когда система не должна зависеть от того, как
в ней создаются, компонуются и представляются продукты:
- инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
- для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
- экземпляры класса могут находиться в одном из не очень большого числа различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.
Структура
Участники
- Prototype(Graphic) прототип: объявляет интерфейс для клонирования самого себя;
- ConcretePrototype (например - нотный стан, целая нота, половинная нота) конкретный прототип: реализует операцию клонирования себя;
- Client(GraphicTool) клиент: создает новый объект, обращаясь к прототипу с запросом клонировать себя.
Отношения
Клиент обращается к прототипу, чтобы тот создал свою копию (запрашивает копию)
Результаты
те же самые результаты, что у абстрактной фабрики и строителя: скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен.
также имеются такие "плюсы":
- добавление и удаление продуктов во время выполнения
- спецификация новых объектов путем изменения значений
- специфицирование новых объектов путем изменения структуры
- уменьшение числа подклассов
- динамическое конфигурирование приложения классами
Недостатки
Основной недостаток паттерна прототип заключается в том, что каждый подкласс класса Prototype должен реализовывать операцию Clone, а это далеко не
всегда просто. Например, сложно добавить операциюClone, когда рассматриваемые классы уже существуют. Проблемы возникают и в случае, если во внутреннем представлении объекта есть другие объекты или наличествуют круговые ссылки.
Реализация
Пример кода
Рассмотрим реализацию паттерна прототип на языке PHP
Известные применения
Родственные паттерны
В некоторых отношениях прототип и абстрактная фабрика являются конкурентами.
Но их используют и совместно. Абстрактная фабрика может хранить набор прототипов, которые клонируются и возвращают изготовленные объекты. В тех проектах, где активно применяются паттерны компоновщик и декоратор, тоже можно извлечь пользу из прототипа
- Log in to post comments
- 4511 reads