
Л а б о р а т о р н а я р а б о т а № 3
«Реализация одного из порождающих шаблонов проектирования»
Цель работы: Применение паттерна проектирования Builder (строитель)
Продолжительность работы - 4 часа.
Содержание
1. Теоретический материал..........................................................................................................1 2. паттерн проектирования Builder (строитель) .....................................................................2 3. Ример реализации паттерна………………….........................................................................4 4. Задание на выполнение лабораторной работы.......................................................................7 5. Требования к отчету................................................................................................................8 6. Вопросы....................................................................................................................................8
Порождающие паттерны.
Порождающие паттерны проектирования абстрагируют процесс инстанцирования объектов. Они позволяют сделать код независимым от способа создания, композиции и представления используемых в его работе объектов.
Паттерн Builder (строитель)
Назначение
Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.
Класс каждого конвертора принимает механизм создания и сборки сложного объекта и скрывает его за абстрактным интерфейсом. Конвертор отделен от загрузчика, который отвечает за синтаксический разбор RTF-документа.
В паттерне строитель абстрагированы все эти отношения. В нем любой класс конвертора называется строителем, а загрузчик – распорядителем.
Применимость
- алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
- процесс конструирования должен обеспечивать различные представления конструируемого объекта.
Структура
Участники
- Builder (TextConverter) - строитель:
- задает абстрактный интерфейс для создания частей объекта Product;
- ConcreteBuilder(ASCIIConverter,TeXConverter,TextWidgetConverter)-конкретный строитель:
- конструирует и собирает вместе части продукта посредством реализации интерфейса Builder;
- определяет создаваемое представление и следит за ним;
- предоставляет интерфейс для доступа к продукту .
- Director (RTFReader) - распорядитель:
- конструирует объект, пользуясь интерфейсом Builder;
- Product (ASCIIText, TeXText, TextWidget) - продукт:
- представляет сложный конструируемый объект. ConcreteBuilder строит внутреннее представление продукта и определяет процесс его сборки;
- включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей.
Отношения
- клиент создает объект-распорядитель Director и конфигурирует его нужным объектом-строителем Builder;
- распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта;
- строитель обрабатывает запросы распорядителя и добавляет новые части к продукту;
- клиент забирает продукт у строителя.
Следующая диаграмма взаимодействий иллюстрирует взаимоотношения строителя и распорядителя с клиентом.
Для получения разных представлений некоторых данных с помощью паттерна Builder распорядитель Director должен использовать соответствующие экземпляры ConcreteBuilder. Ранее говорилось о задаче преобразования RTF-документов в документы различных форматов. Для ее решения класс Builder объявляет интерфейсы для преобразования отдельных частей исходного документа, таких как текст, графика и управляющая информация о форматировании, а производные классы WordBuilder, AsciiBuilder и другие их реализуют с учетом особенностей того или иного формата. Так, например, конвертор AsciiBuilder должен учитывать тот факт, что простой текст не может содержать изображений и управляющей информации о форматировании, поэтому соответствующие методы будут пустыми.
По запросу клиента распорядитель Director будет последовательно вычитывать данные из RTF-документа и передавать их в выбранный ранее конвертор, например, AsciiBuilder. После того как все данные прочитаны, полученный новый документ в виде ASCII-теста можно вернуть клиенту. Следует отметить, для того чтобы заменить формат исходных данных (здесь RTF) на другой, достаточно использовать другой класс распорядителя.