Позволяет создавать сложные объекты пошагово.
Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов.
-
Когда вы хотите избавиться от «телескопического конструктора».
- Допустим, у вас есть один конструктор с десятью опциональными параметрами. Его неудобно вызывать, поэтому вы создали ещё десять конструкторов с меньшим количеством параметров. Всё что они делают - это переадресуют вызов к главному конструктору, подавая какие-то значения по умолчанию в качестве опциональных параметров.
class Pizza {
Pizza(int size) { ... }
Pizza(int size, boolean cheese) { ... }
Pizza(int size, boolean cheese, boolean pepperoni) { ... }
...
Паттерн Строитель позволяет собирать объекты пошагово, вызывая только те шаги, которые вам нужны. А значит, больше не нужно пытаться запихнуть в конструктор все возможные опции продукта.
-
Когда ваш код должен создавать разные представления какого-то объекта. Например, деревянные и железобетонные дома.
-
Строитель можно применить, если создание нескольких представлений объекта состоит из одинаковых этапов, которые отличаются в деталях.
Интерфейс строителей определит все возможные этапы конструирования. Каждому представлению будет соответствовать собственный класс-строитель. А порядок этапов строительства будет задавать класс-директор (возможно что и сам клиент).
-
-
Когда вам нужно собирать сложные составные объекты, например, деревья Компоновщика.
-
Строитель конструирует объекты пошагово, а не за один проход. Более того, шаги строительства можно выполнять рекурсивно. А без этого не построить древовидную структуру вроде Компоновщика.
Заметьте, что Строитель не позволяет посторонним объектам иметь доступ к конструируемому объекту пока тот не будет полностью готов. Это предотвращает клиентский код от получения незаконченных «битых» объектов.
-
-
Убедитесь в том, что создание разных представлений объекта можно свести к общим шагам.
-
Опишите эти шаги в общем интерфейсе строителей.
-
Для каждого из представлений объекта-продукта создайте по одному классу-строителю и реализуйте их методы строительства.
Не забудьте про метод получения результата. Обычно, конкретные строители определяют собственные методы получения результата строительства. Вы не можете описать эти методы в интерфейсе строителей, так продукты не обязательно должны иметь общий базовый класс или интерфейс. Но вы всегда можете добавить метод получения результата в общий интерфейс, если ваши строители производят однородные продукты с общим предком.
-
Подумайте о создании класса директора. Его методы будут создавать различные конфигурации продуктов, вызывая разные шаги одного и того же строителя.
-
Клиентский код должен будет создавать и объекты строителей, и/(или нет) объект директора. Перед началом строительства, клиент должен связать определённого строителя с директором. Это можно сделать либо через конструктор, либо через сеттер, либо подав строителя напрямую в в строительный метод директора.
-
Результат строительства можно вернуть из директора, но только если метод возврата продукта удалось поместить в общий интерфейс строителей. Иначе, вы жёстко привяжете директора к конкретным классам строителей.
+ | - |
---|---|
Позволяет создавать продукты пошагово. | Усложняет код программы за счёт дополнительных классов. |
Позволяет использовать один и тот же код для создания различных продуктов. | Клиент будет привязан к конкретным классам строителей, так как в интерфейсе строителя может не быть метода получения результата. |
Изолирует сложный код сборки продукта от его основной бизнес-логики. |
-
Многие архитектуры начинаются с применения Фабричного метода (более простого и расширяемого через подклассы) и эволюционируют в сторону Абстрактной фабрики, Прототипа или Строителя (более гибких, но и более сложных).
-
Строитель концентрируется на постройке сложных объектов шаг за шагом. Абстрактная фабрика специализируется на создании семейств связанных продуктов. Строитель возвращает продукт только после выполнения всех шагов, а Абстрактная фабрика возвращает продукт сразу же.
-
Строитель позволяет пошагово сооружать дерево Компоновщика.
-
Паттерн Строитель может быть построен в виде Моста: директор будет играть роль абстракции, а строители - реализации.
-
Абстрактная фабрика, Строитель и Прототип могут быть реализованы при помощи Одиночки.