-
Notifications
You must be signed in to change notification settings - Fork 3
Prototype
Прототип — паттерн, порождающий объекты.
Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.
- Используйте паттерн прототип, когда система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты;
- Инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
- Для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
- Экземпляры класса могут находиться в одном из не очень большого числа различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.
- Prototype — прототип: объявляет интерфейс для клонирования самого себя;
- ConcretePrototype — конкретный прототип: реализует операцию клонирования себя;
- Client — клиент: создает новый объект, обращаясь к прототипу с запросом клонировать себя.
У прототипа те же самые результаты, что у абстрактной фабрики и строителя: он скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен. Кроме того, все эти паттерны позволяют клиентам работать со специфичными для приложения классами без модификаций.
- Добавление и удаление продуктов во время выполнения;
- Спецификация новых объектов путем изменения значений;
- Специфицирование новых объектов путем изменения структуры;
- Уменьшение числа подклассов;
- Динамическое конфигурирование приложения классами.
Основной недостаток паттерна прототип заключается в том, что каждый под класс класса Prototype должен реализовывать операцию Clone, а это далеко не всегда просто. Например, сложно добавить операцию Clone, когда рассматриваемые классы уже существуют. Проблемы возникают и в случае, если во внутреннем представлении объекта есть другие объекты или наличествуют круговые ссылки.