Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

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

Назначение

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

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

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

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

Структура

Участники

  • Builder -  стоитель - задает абстрактный интерфейс для создания частей объекта Product;
  • ConcreteBuilder - конкретный строитель:
    • конструирует и собирает вместе части продукта посредством реализации интерфейса Builder;
    • определяет создаваемое представление и следит за ним;
    • предоставляет интерфейс для доступа к продукту;
  • Director - распорядитель - конструирует объект, пользуясь интерфейсом Builder;
  • Product - продукт:
    • представляет сложный конструируемый объект. ConcreteBuilder строит внутреннее представление продукта и определяет процесс его сборки;
    • включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей.

Результаты

  • позволяет изменять внутреннее представление продукта.  Объект Builder предоставляет распорядителю абстракный интерфейс для конструирования продукта, за которым он может скрыть представление и внутреннюю структуру продукта, а так же процесс его сборки. Поскольку продукт конструируется через абстрактный интерфейс, то для изменения внутреннего представления достаточно всего лишь определить нового строителя;
  • изолирует код, реализующий конструирование и представление. Паттерн строитель улучшает модульность, инкапсулируя способ конструирования и представления сложного объекта. Клиентам ничего не надо знать о классах, определяющих внутреннюю структуру продукта, они отсутствуют в интерфейсе строителя. Каждый конкретный строитель ConcreteBuilder содержит весь код, необходимый для создания и сборки конкретного вида продукта. Код пишется только один раз, после чего разные распорядители могут использовать его повторно для построения вариантов продукта из одних и тех же частей.
  • дает более тонкий контроль над процессом конструирования. В отличии от порождающих паттернов, которые сразу конструируют весь объект целиком, строитель делает это шаг за шагом под управлением распорядителя. И лишь когда продукт завершен, распорядитель забирает его у строителя. Поэтому интерфейс строителя в большей степени отражает процесс конструирования продукта, нежели другие порождающие паттерны. Это позволяет обеспечить более тонкий контроль над процессом конструирования, а значит, и над внутренней структурой готового продукта.