Технология Клиент-Сервер 2004'1 |
|||||||
|
По словам классика жанра К. Александра, «любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново». Сам классик имел в виду паттерны, возникающие при проектировании зданий и городов, так как был архитектором, Но его слова применимы и в отношении паттернов объектно-ориентированного проектирования. Наши решения выражаются в терминах классов, объектов, интерфейсов и операций, а не стен и дверей, но и в том, и в другом случае смысл паттерна – предложить решение определенной задачи в конкретном контексте. Итак, паттерн (шаблон, образец ) - это типичное решение типичной проблемы в некотором контексте.
В самом общем случае паттерн состоит из четырех основных элементов:
Подведем итоги. Паттерн проектирования именует, абстрагирует и идентифицирует ключевые аспекты структуры общего решения, которые и позволяют применить его для создания повторно используемого дизайна. Он выделяет участвующие классы и объекты, их роли и отношения, а также операции. При описании каждого паттерна внимание концентрируется на конкретной задаче объектно-ориентированного проектирования. Анализируются ситуации, когда следует применять паттерн, можно ли его использовать с учетом других ограничений проекта, каковы будут последствия его применения. А так как "суха теория мой друг, а древо жизни вечно зеленеет", в состав паттерна включается пример кода (у западных авторов — на C++, иногда на Smalltalk, у нас — на любом объектно-ориентированном языке, например, ObjectPascal), иллюстрирующем его реализацию.
Короче, паттерны проектирования мощное, хотя и не абсолютное оружие. Добро пожаловать в библиотеку паттернов.
С той или иной мерой условности паттерны можно разделить на порождающие, структурные, системные, паттерны поведения и распределения обязанностей. В соответствии с этой классификацией и будет построен следующий материал. Все эти паттерны уже были описаны в книгах различных авторов, например, в часто упоминающейся и широко представленной здесь работе «банды четырех» . В данной статье делается попытка свести их воедино.
В первой части материала речь пойдет о порождающих паттернах Abstract Factory, Builder, Factory Method, Prototype и Singleton.
Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Известен также под именем Kit (инструментарий).
Рассмотрим инструментальную программу для создания пользовательского интерфейса, поддерживающего разные стандарты внешнего облика, например Motif и Presentation Manager. Внешний облик определяет визуальное представление и поведение элементов пользовательского интерфейса ("виджетов") – полос прокрутки, окон и кнопок. Чтобы приложение можно было перенести на другой стандарт, в нем не должен быть жестко закодирован внешний облик виджетов. Если инстанцирование классов для конкретного внешнего облика разбросано по всему приложению, то изменить облик впоследствии будет нелегко.
Мы можем решить эту проблему, определив абстрактный класс WidgetFactory, в котором объявлен интерфейс для создания всех основных видов виджетов. Есть также абстрактные классы для каждого отдельного вида и конкретные подклассы, реализующие виджеты с определенным внешним обликом. В интерфейсе WidgetFactory имеется операция, возвращающая новый объект-виджет дли каждого абстрактного класса виджетов. Клиенты вызывают эти операции для получения экземпляров виджетов, но при этом ничего не знают о том, какие именно классы используют. Стало быть, клиенты остаются независимыми от выбранного стандарта внешнего облика.
Для каждого стандарта внешнего облика существует определенный подкласс WidgetFactory. Каждый такой подкласс реализует операции, необходимые для создания соответствующего стандарту виджета. Например, операция CreateScrollBar в классе MotifWidgetFactory создает и возвращает полосу прокрутки в стандарте Motif, тогда как соответствующая операция в классе PMWidgetFactory возвращает полосу прокрутки в стандарте Presentation Manager. Клиенты создают виджеты, пользуясь исключительно интерфейсом WidgetFactory, и им ничего не известно о классах, реализующих виджеты для конкретного стандарта. Другими словами, клиенты должны лишь придерживаться интерфейса, определенного абстрактным, а не конкретным классом.
Класс WidgetFactory также устанавливает зависимости между конкретными классами виджетов. Полоса прокрутки для Motif должна использоваться с кнопкой и текстовым полем Motif, и это ограничение поддерживается автоматически, как следствие использования класса MotifWidgetFactory.
Copyright © 1994-2016 ООО "К-Пресс"