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

Что это?
Шаблон построителя уменьшает объем кода, необходимого для создания объектов. Поэтому, если вам нужно построить сложную вещь, вы можете упростить этот процесс, используя паттерн построителя. Составной или составной объект — это то, что обычно делает строитель.
Шаблон построителя инкапсулирует процесс построения сложного объекта, отделяя его представление от его построения. Это позволяет нам создавать разные модели с помощью одного и того же процесса строительства. На языке Java это означает создание объектов других классов, которые могут использовать один и тот же процесс построения.
Диаграмма классов
Диаграмма классов включает в себя следующие сущности:
- Строитель
- Бетонный строитель
- директор
- Товар

Продолжая наш пример с самолетами, скажем, что конструкция самолета включает три этапа:
- изготовление кабины
- затем двигатель
- и, наконец, крылья
Давайте теперь посмотрим на код. Во-первых, мы начнем с абстрактного интерфейса для нашего AircraftBuilder
класса. Далее, каждый строитель содержит методы, которые могут быть переопределены конкретными разработчиками в зависимости от того, будут ли они включать эту часть в конечный вариант продукта, за создание которого они несут ответственность.

Сейчас мы реализуем два конкретных конструктора, один для F-16 и один для Boeing-747.

Для простоты мы предоставили скелет компоновщиков и пропустили индивидуальную реализацию каждого метода. Это F16Builder
не отменяет buildBathrooms
метод, потому что в кабине F-16 нет туалетов. Создатель Боинга 747 отменяет метод ванной комнаты, поскольку в Боинге 747 есть ванные комнаты для пассажиров.
Класс Director
отвечает за запись процесса или алгоритма, необходимого для создания самолета, например, определенного порядка, в котором изготавливаются различные части. Режиссер подобен строителю самолета. Готовое изделие ему возвращают строители.

Обратите внимание, что мы можем указать конструктор по нашему выбору и изменить продукт (представление) самолета, чтобы он был либо F-16, либо Boeing-747. В нашем сценарии сборщики возвращают разные супертипы, но это может быть не так, если они возвращают продукты, которые не очень похожи.
Клиент будет применять шаблон следующим образом:

Интерфейс AircraftBuilder
скрывает, как строится самолет. Клиент не знает о классах F16Engine
, F16Cockpit
которые используются для создания Боинг-747.
Пропуск режиссера
Шаблон Builder часто используется без директора. Вместо этого клиент может напрямую создать экземпляр конструктора и вызвать необходимые методы, чтобы получить продукт для себя. Это обычное противоядие для телескопических конструкторов. Например, представьте себе класс со слишком большим количеством атрибутов, но некоторые из них можно сделать необязательными. В таком случае вы можете вызвать конструктор только для установки необходимых атрибутов и создания продукта.
Другие примеры
- Java API предоставляет
StringBuilder
класс, который не совсем соответствует шаблону конструктора GoF, но его все же можно рассматривать как его пример. Класс StringBuilder предоставляет метод добавления, который возвращает новую строку путем добавления символов из исходной строки. - Другим гипотетическим примером может быть создание документов типа pdf или HTML.

Вышеупомянутый метод может появиться в клиентском или серверном коде, и различные типы документов могут быть созданы путем передачи другого DocumentBuilder
в метод. Мы могли бы вывести a HtmlDocumentBuilder
и a PdfDocumentBuilder
из абстрактного класса DocumentBuilder
.
Предостережения
Шаблоны конструктора и абстрактной фабрики имеют схожие цели, но подходят к ним по-разному. Например, шаблон построителя создает объекты шаг за шагом, тогда как абстрактная фабрика возвращает объект за один раз.