Продолжается подписка на наши издания! Вы не забыли подписаться?

Шаблоны проектирования. Что это такое?


Abstract Factory (Абстрактная фабрика)
Назначение
Мотивация
Применимость
Структура
Участники
Отношения
Результаты
Реализация
Известные применения
Родственные паттерны
Builder (Строитель)
Назначение
Мотивация
Применимость
Структура
Участники
Отношения
Результаты
Реализация
Известные применения
Родственные паттерны
Factory Method (фабричный метод)
Назначение
Мотивация
Применимость
Структура
Участники
Отношения
Результаты
Реализация
Известные применения
Родственные паттерны
Prototype (прототип) – паттерн, порождающий объекты
Назначение
Мотивация
Применимость
Структура
Участники
Отношения
Результаты
Реализация
Известные применения
Родственные паттерны
Singleton (Одиночка) – паттерн, порождающий объекты
Назначение
Мотивация
Применимость
Структура
Участники
Отношения
Результаты
Реализация
Известные применения
Родственные паттерны

По словам классика жанра К. Александра, «любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново». Сам классик имел в виду паттерны, возникающие при проектировании зданий и городов, так как был архитектором, Но его слова применимы и в отношении паттернов объектно-ориентированного проектирования. Наши решения выражаются в терминах классов, объектов, интерфейсов и операций, а не стен и дверей, но и в том, и в другом случае смысл паттерна – предложить решение определенной задачи в конкретном контексте. Итак, паттерн (шаблон, образец ) - это типичное решение типичной проблемы в некотором контексте.

В самом общем случае паттерн состоит из четырех основных элементов:

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

Короче, паттерны проектирования мощное, хотя и не абсолютное оружие. Добро пожаловать в библиотеку паттернов.

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

В первой части материала речь пойдет о порождающих паттернах Abstract Factory, Builder, Factory Method, Prototype и Singleton.

Abstract Factory (Абстрактная фабрика)

 

Назначение

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Известен также под именем Kit (инструментарий).

Мотивация

Рассмотрим инструментальную программу для создания пользовательского интерфейса, поддерживающего разные стандарты внешнего облика, например Motif и Presentation Manager. Внешний облик определяет визуальное представление и поведение элементов пользовательского интерфейса ("виджетов") – полос прокрутки, окон и кнопок. Чтобы приложение можно было перенести на другой стандарт, в нем не должен быть жестко закодирован внешний облик виджетов. Если инстанцирование классов для конкретного внешнего облика разбросано по всему приложению, то изменить облик впоследствии будет нелегко.

Мы можем решить эту проблему, определив абстрактный класс WidgetFactory, в котором объявлен интерфейс для создания всех основных видов виджетов. Есть также абстрактные классы для каждого отдельного вида и конкретные подклассы, реализующие виджеты с определенным внешним обликом. В интерфейсе WidgetFactory имеется операция, возвращающая новый объект-виджет дли каждого абстрактного класса виджетов. Клиенты вызывают эти операции для получения экземпляров виджетов, но при этом ничего не знают о том, какие именно классы используют. Стало быть, клиенты остаются независимыми от выбранного стандарта внешнего облика.

Для каждого стандарта внешнего облика существует определенный подкласс WidgetFactory. Каждый такой подкласс реализует операции, необходимые для создания соответствующего стандарту виджета. Например, операция CreateScrollBar в классе MotifWidgetFactory создает и возвращает полосу прокрутки в стандарте Motif, тогда как соответствующая операция в классе PMWidgetFactory возвращает полосу прокрутки в стандарте Presentation Manager. Клиенты создают виджеты, пользуясь исключительно интерфейсом WidgetFactory, и им ничего не известно о классах, реализующих виджеты для конкретного стандарта. Другими словами, клиенты должны лишь придерживаться интерфейса, определенного абстрактным, а не конкретным классом.

Класс WidgetFactory также устанавливает зависимости между конкретными классами виджетов. Полоса прокрутки для Motif должна использоваться с кнопкой и текстовым полем Motif, и это ограничение поддерживается автоматически, как следствие использования класса MotifWidgetFactory.

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

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

Copyright © 1994-2016 ООО "К-Пресс"