Образец прототипа
Прототип приводит к клонированному объекту, который отличается от исходного объекта. Состояние оригинала такое же, как у клона, во время клонирования. После этого каждый объект может подвергаться изменению состояния. Вы можете думать об этом как о чем-то похожем, копируя оригинал, а затем модифицируя его в нескольких местах.
Пример
- Дублирование DVD: Дублирование основного DVD для создания нескольких копий
- Объект отчетности. Рассмотрим объект отчета, который содержит обработанную информацию для передачи в графический интерфейс. Исходный отчет содержит данные в порядке возрастания. Теперь, используя этот шаблон, можно создать аналогичный отчет, но с данными, отсортированными в порядке убывания.
Преимущества
- Производительность: клонирование (с использованием MemberwiseClone ) значительно дешевле, чем создание нового объекта заново (с оператором new ). Обратите внимание, что нужно переопределить
MemberwiseClose()
, чтобы выполнить глубокое копирование.
- Объекты могут быть клонированы очень динамично, без каких-либо настойчивых требований. Первый созданный объект может быть создан в любое время при выполнении приложения, и дальнейшее дублирование может иметь место в любое время вперед.
Когда его использовать
- Когда классы для создания экземпляров указываются во время выполнения, например, динамической загрузкой.
- Когда экземпляры класса могут иметь одну из нескольких различных комбинаций состояний. Может быть удобнее установить соответствующее количество прототипов и клонировать их, чем создавать экземпляр класса вручную, каждый раз с соответствующим состоянием.
Сравнение с заводским шаблоном
Шаблон прототипа позволяет объекту создавать настраиваемые объекты, не зная их класса или каких-либо подробностей о том, как их создавать. Таким образом, именно этот аспект очень похож на шаблон фабричного метода. В обоих этих шаблонах клиент может создавать любые объекты производного класса, ничего не зная об их собственной структуре.
Но разница между этими двумя шаблонами заключается в том, что для Factory Method
концентрируется на создании одного объекта несуществующего типа объекта как fresh creation
(понимая точный подтип класса Creator). Шаблон Prototype
использует сам класс, особенно производный класс для действия self duplication
.
Шаблон фабричного метода
В этом шаблоне клиент (или потребитель) запрашивает Создателя (или фабрику) об определенном типе объекта из иерархии классов. Метод Creator класса фабрики делегирует создание конкретного объекта производным классам и возвращает объект класса того типа, который запрашивает клиент. По сути, у вас есть единая точка контакта для создания нескольких объектов иерархии классов.
Вы можете думать об этом как о том, что вы идете к счетчику авиабилетов (диспетчеру) и запрашиваете билет, указав предпочитаемый вами тип билета (первый класс, представительский или эконом). Пользователь не заботится о том, как генерируется билет, даже если в представлении объекта первый класс и билет эконом-класса получены из базового класса билета.
Когда использовать
- Важна гибкость (слабое сцепление)
- Объекты могут быть расширены в подклассах
- Существует определенная причина, по которой один подкласс будет выбран вместо другого - эта логика является частью фабричного метода.
- Клиент делегирует обязанности подклассам в параллельных иерархиях.
Абстрактный фабричный рисунок
Abstract factory идет на шаг выше (более абстрактный), чем шаблон фабричного метода. В этом случае можно иметь не один, а несколько заводов с небольшими вариациями. Он отвечает за создание объектов, принадлежащих семействам иерархий классов, а не только одной иерархии классов.
Определенный класс Factory уже существует. Но у Фабрики будут несколько разные методы. Каждый метод может создать экземпляр. Клиент может выбрать подходящий метод и получить экземпляр.
Если вы возьмете пример идеального архитектурного дизайна на основе MVC , клиент будет классом Business Controller, а все конкретные продукты - бизнес-объектами. Фабрики являются вспомогательными (вспомогательными) контроллерами. Они работают совместно с запросом от Business Controller.
Когда использовать
- Ожидается, что система будет независима от того, как создаются продукты. Можно даже ожидать независимости от того, как продукты составлены и представлены. Термин «продукт» применяется к конечному получающемуся объекту, который разработчик клиента должен будет использовать, вызывая его методы.
- Система, которая должна конфигурироваться с одним из нескольких семейств продуктов. Таким образом, фактический выбор семейства будет не во время кодирования, а во время более позднего конфигурирования.
- Семейство продуктов предназначено для совместной работы.
- Создание для библиотеки продуктов. Больше всего здесь волнует соответствующий интерфейс, а не реализация.