Паттерн Строитель
Primary tabs
Forums:
Название и классификация
Строитель. Порождающие паттерны
Назначение
Отделяет конструирование сложного объекта от его представления, так что
в результате одного и того же процесса конструирования могут получаться раз:
ные представления.
Псевдоним
строитель - просто строитель =)
Мотивация
У нас есть некоторый текстовый редактор, в котором один и тот же файл мы хотели бы представлять в разных форматах, например:
- просто текст
- форматированный текст
- текст в процессе редактирования (там, где например видны теги разметки)
- что-то ещё
Специфика в том, что вид объектов строится (дополняется) частями - скажем - при прокрутке области экрана
Применимость
Используйте паттерн строитель, когда:
- алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
- процесс конструирования должен обеспечивать различные представления конструируемого объекта.
Структура
Участники
- Builder(TextConverter) ; строитель: задает абстрактный интерфейс для создания частей объектаProduct;
- ConcreteBuilder(ASCIIConverter,TeXConverter,TextWidgetConverter);конкретный строитель:- конструирует и собирает вместе части продукта посредством реализации интерфейса Builder;; определяет создаваемое представление и следит за ним; предоставляет интерфейс для доступа к продукту (например,GetASCIIText,GetTextWidget);
- Director (RTFReader) ; распорядитель: конструирует объект, пользуясь интерфейсомBuilder;
- Product (ASCIIText,TeXText,TextWidget) ; продукт: - представляет сложный конструируемый объект.ConcreteBuilder - строит внутреннее представление продукта и определяет процесс его
сборки;
включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей
Отношения
- клиент создает объект-распорядитель Director и конфигурирует его нужным объектом-строителем Builder;
- распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта;
- строитель обрабатывает запросы распорядителя и добавляет новые части к продукту;
- клиент забирает продукт у строителя.
На диаграмме данный процесс можно представить так:
Результаты
- позволяет изменять внутреннее представление продукта
- изолирует код, реализующий конструирование и представление
- дает более тонкий контроль над процессом конструирования
Реализация
Особенности, о которых стоит упомянуть:
- интерфейс сборки и конструирования - должен быть достаточно общим
- нет абстрактного класса для продуктов (продукты сильно разнятся - потому нет смысла в общем интерфейсе)
- пустые методы класса Builder по умолчанию (а не виртульные) - специально для того чтобы их не обязательно было реализовывать в каждом конкретном строителе
Пример кода
Рассмотрим пример кода на PHP
Известные применения
Приложение, конвертирующее RTF из библиотеки ET++
Родственные паттерны
- Абстрактная фабрика
- Прототип (его строитель может порождать)
- Log in to post comments
- 3773 reads