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