Паттерн Строитель

Название и классификация

Строитель. Порождающие паттерны

Назначение

Отделяет конструирование сложного объекта от его представления, так что
в результате одного и того же процесса конструирования могут получаться раз:
ные представления.

Псевдоним

строитель - просто строитель =)

Мотивация

У нас есть некоторый текстовый редактор, в котором один и тот же файл мы хотели бы представлять в разных форматах, например:

  1. просто текст
  2. форматированный текст
  3. текст в процессе редактирования (там, где например видны теги разметки)
  4. что-то ещё

Специфика в том, что вид объектов строится (дополняется) частями - скажем - при прокрутке области экрана

строитель паттерн мотивация

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

Используйте паттерн строитель, когда:

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

Структура

структура паттерн строитель

Участники

  1. Builder(TextConverter) ; строитель: задает абстрактный интерфейс для создания частей объектаProduct;
  2. ConcreteBuilder(ASCIIConverter,TeXConverter,TextWidgetConverter);конкретный строитель:- конструирует и собирает вместе части продукта посредством реализации интерфейса Builder;; определяет создаваемое представление и следит за ним; предоставляет интерфейс для доступа к продукту (например,GetASCIIText,GetTextWidget);
  3. Director (RTFReader) ; распорядитель: конструирует объект, пользуясь интерфейсомBuilder;
  4. Product (ASCIIText,TeXText,TextWidget) ; продукт: - представляет сложный конструируемый объект.ConcreteBuilder - строит внутреннее представление продукта и определяет процесс его
    сборки;
    включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей

Отношения

  1. клиент создает объект-распорядитель Director и конфигурирует его нужным объектом-строителем Builder;
  2. распорядитель уведомляет строителя о том, что нужно построить очередную часть продукта;
  3. строитель обрабатывает запросы распорядителя и добавляет новые части к продукту;
  4. клиент забирает продукт у строителя.

На диаграмме данный процесс можно представить так:
отношения паттерн строитель

Результаты

  1. позволяет изменять внутреннее представление продукта
  2. изолирует код, реализующий конструирование и представление
  3. дает более тонкий контроль над процессом конструирования

Реализация

Особенности, о которых стоит упомянуть:

  1. интерфейс сборки и конструирования - должен быть достаточно общим
  2. нет абстрактного класса для продуктов (продукты сильно разнятся - потому нет смысла в общем интерфейсе)
  3. пустые методы класса Builder по умолчанию (а не виртульные) - специально для того чтобы их не обязательно было реализовывать в каждом конкретном строителе

Пример кода

Рассмотрим пример кода на PHP

Известные применения

Приложение, конвертирующее RTF из библиотеки ET++

Родственные паттерны

  1. Абстрактная фабрика
  2. Прототип (его строитель может порождать)