Skip to content

Latest commit

 

History

History
98 lines (63 loc) · 9.52 KB

Builder.md

File metadata and controls

98 lines (63 loc) · 9.52 KB

Строитель

UML

Позволяет создавать сложные объекты пошагово.

Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов.

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

  • Когда вы хотите избавиться от «телескопического конструктора».

    • Допустим, у вас есть один конструктор с десятью опциональными параметрами. Его неудобно вызывать, поэтому вы создали ещё десять конструкторов с меньшим количеством параметров. Всё что они делают - это переадресуют вызов к главному конструктору, подавая какие-то значения по умолчанию в качестве опциональных параметров.
class Pizza {
    Pizza(int size) { ... }        
    Pizza(int size, boolean cheese) { ... }    
    Pizza(int size, boolean cheese, boolean pepperoni) { ... }
    ...

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

  • Когда ваш код должен создавать разные представления какого-то объекта. Например, деревянные и железобетонные дома.

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

      Интерфейс строителей определит все возможные этапы конструирования. Каждому представлению будет соответствовать собственный класс-строитель. А порядок этапов строительства будет задавать класс-директор (возможно что и сам клиент).

  • Когда вам нужно собирать сложные составные объекты, например, деревья Компоновщика.

    • Строитель конструирует объекты пошагово, а не за один проход. Более того, шаги строительства можно выполнять рекурсивно. А без этого не построить древовидную структуру вроде Компоновщика.

      Заметьте, что Строитель не позволяет посторонним объектам иметь доступ к конструируемому объекту пока тот не будет полностью готов. Это предотвращает клиентский код от получения незаконченных «битых» объектов.

Шаги реализации

  1. Убедитесь в том, что создание разных представлений объекта можно свести к общим шагам.

  2. Опишите эти шаги в общем интерфейсе строителей.

  3. Для каждого из представлений объекта-продукта создайте по одному классу-строителю и реализуйте их методы строительства.

    Не забудьте про метод получения результата. Обычно, конкретные строители определяют собственные методы получения результата строительства. Вы не можете описать эти методы в интерфейсе строителей, так продукты не обязательно должны иметь общий базовый класс или интерфейс. Но вы всегда можете добавить метод получения результата в общий интерфейс, если ваши строители производят однородные продукты с общим предком.

  4. Подумайте о создании класса директора. Его методы будут создавать различные конфигурации продуктов, вызывая разные шаги одного и того же строителя.

  5. Клиентский код должен будет создавать и объекты строителей, и/(или нет) объект директора. Перед началом строительства, клиент должен связать определённого строителя с директором. Это можно сделать либо через конструктор, либо через сеттер, либо подав строителя напрямую в в строительный метод директора.

  6. Результат строительства можно вернуть из директора, но только если метод возврата продукта удалось поместить в общий интерфейс строителей. Иначе, вы жёстко привяжете директора к конкретным классам строителей.

Преимущества и недостатки

+ -
Позволяет создавать продукты пошагово. Усложняет код программы за счёт дополнительных классов.
Позволяет использовать один и тот же код для создания различных продуктов. Клиент будет привязан к конкретным классам строителей, так как в интерфейсе строителя может не быть метода получения результата.
Изолирует сложный код сборки продукта от его основной бизнес-логики.

Отношения с другими паттернами

  • Многие архитектуры начинаются с применения Фабричного метода (более простого и расширяемого через подклассы) и эволюционируют в сторону Абстрактной фабрики, Прототипа или Строителя (более гибких, но и более сложных).

  • Строитель концентрируется на постройке сложных объектов шаг за шагом. Абстрактная фабрика специализируется на создании семейств связанных продуктов. Строитель возвращает продукт только после выполнения всех шагов, а Абстрактная фабрика возвращает продукт сразу же.

  • Строитель позволяет пошагово сооружать дерево Компоновщика.

  • Паттерн Строитель может быть построен в виде Моста: директор будет играть роль абстракции, а строители - реализации.

  • Абстрактная фабрика, Строитель и Прототип могут быть реализованы при помощи Одиночки.