Опубликован: 12.10.2017 | Доступ: свободный | Студентов: 857 / 143 | Длительность: 07:43:00
Лекция 7:

Порождающие шаблоны проектирования

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

Одиночка

Этот шаблон проектирования является самым известным и наиболее обсуждаемым.

Несмотря на удобство его применения, шаблон "Одиночка", при всех неоспоримых достоинствах, о которых мы поговорим далее, один из самых спорных при разработке и рекомендуется, только если нет никакого другого способа решения.

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

Жизненной аналогией этого шаблона проектирования является монопольный сервис или продукт, используемый на безальтернативной основе, –правительственный кабинет, ЖЭУ, энергостанция в удаленном географически районе и т.д.

При реализации этого шаблона разумнее создавать именно статические экземпляры абстрактного класса, а не объявлять требуемые методы статическими.Это будет являться дополнительным преимуществом использования этого шаблона, поскольку при применении методов экземпляра можно использовать механизм наследования и создавать подклассы.

Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не один экземпляр объекта, а несколько.

В качестве основных достоинств использования этого шаблона проектирования можно выделить следующие:

  • Контролируемый доступ к единственному экземпляру.
  • Шаблон допускает уточнение операций над экземплярами и их представление.
  • Высокая гибкость при модификации класса.

Единственным его недостатком является то, что в некоторых случаях он приводит к созданию немасштабируемого приложения.

Прототип

Любая современная информационная система не должна зависеть от того, как в ней создаются, компонуются и представляются объекты.

Для того чтобы практически поддержать данный постулат, следует создавать новые объекты с помощью паттерна "Прототип". Этот шаблон объявляет интерфейс для клонирования самого себя. Логика приложения, создавая новый объект, обращается к "Прототипу" с запросом его клонирования.

Реализация этого шаблона в отдельных деталях напоминает паттерн "Абстрактная фабрика".Он также служит для создания объектов, однако с другим подходом.

Отличительными условиями, характеризующими уместность применения шаблона "Прототип", являются:

  • Определение создаваемого объекта динамически, во время выполнения.
  • Нежелательное создание отдельной иерархии классов фабрик для создания объектов-продуктов из параллельной иерархии классов (отличие от шаблона "Абстрактная фабрика").
  • Функционал клонирования объекта является более предпочтительным вариантом, нежели его создание и инициализация с помощью конструктора.
    • Особенно в ситуациях, когда объект может принимать небольшое ограниченное число возможных состояний.

Нужно заметить, что клонирование не обязательно должно производиться в реализации самого шаблона "Прототип" – это может быть и какой-то другой объект, к которому сам "Прототип" должен иметь постоянный и полный доступ.

Аналогией этого шаблона является шаблон "Шаблонный метод". Разница состоит в том, что "Шаблонный метод"– поведенческий шаблон проектирования, определяющий основу алгоритма, на которой экземпляры объектов могут переопределять отдельные шаги общего алгоритма, а "Прототип"–порождающий шаблон, на основе которого объекты создаются.

Создатель экземпляров

В условиях, когда не определено, какой из системных компонентов должен отвечать за создание экземпляров класса, используют паттерн "Создатель экземпляров".

Идея реализации этого шаблона состоит в том, что ответственность за создание объектов класса 1 делегируется классу 2.

Предпосылки к созданию подобного шаблона проектирования исходят из необходимости класса 2 агрегировать, использовать, модифицировать объекты класса 1. Типичным структурным объектом, созданным на основе паттерна "Создатель экземпляров", является рассмотренный нами ранее шаблон "Информационный эксперт".

Основным преимуществом использования данного паттерна является сохранение гибкости системы по причине того, что созданные объекты класса 1, как правило, видны только для класса 1. Но в ситуации, когда процедура создания классов является сложной и многоэтапной, логичнее будет использовать шаблон проектирования "Абстрактная фабрика".

Строитель

Если требуется отделить конструирование сложного объекта от его представления таким образом, чтобы в результате одного и того же конструирования могли получаться различные представления, используют шаблон "Строитель". Суть этого шаблона состоит в том, что алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как эти части должны взаимодействовать между собой.

Шаблон "Строитель" изолирует код, реализующий создание объекта и его представление.

Шаблон "Строитель" очень похож на уже изученные нами в этой главе шаблоны "Абстрактная фабрика" и "Прототип". Основное различие состоит в том, что "Строитель", как правило, уже должен содержать все сложные операции по созданию требуемого объекта:

  1. "Абстрактная фабрика" – это автомат по продаже напитков.В нем уже есть все готовое. Он собирает конечный продукт из полуфабрикатов и заготовок (напиток, стакан, сахар, ложечка и т.д.).
  2. "Строитель"– завод, который производит напитки и содержит в себе все операции. Он собирает сложные объекты из более простых (упаковка, этикетка, вода, ароматизаторы и т.п.) в зависимости от конечного запроса потребителя.

Алгоритм реализации шаблона "Строитель"выглядит следующим образом:

  1. "Клиент" создает объект –"Директор".
    • Конфигурирование объекта"Строитель" проходит через объект "Директор".
  2. "Директор" уведомляет "Строителя" о необходимости строительства очередной части"Продукта".
  3. "Строитель" обрабатывает запросы "Директора".
    • При необходимости добавляет новые или трансформирует существующие части "Продукта".
  4. "Клиент" забирает "Продукт" у "Строителя".

В результате использования паттерна "Строитель" можно добиться следующих значимых преимуществ:

  • "Строитель" предоставляет промежуточному объекту абстрактный интерфейс для конструирования необходимого продукта, за которым может скрыть представление, внутреннюю структуру и процесс сборки самого продукта.
  • Для изменения внутреннего представления "Продукта" достаточно определить новый вид "Строителя".
< Лекция 6 || Лекция 7: 123 || Лекция 8 >