Перейти к основному содержимому

Что это такое

Паттерн Builder («строитель») создаёт сложный объект шаг за шагом. Вместо одного конструктора с длинным и непонятным списком аргументов строитель предлагает небольшие именованные шаги — и финальный build(), который возвращает готовый объект.

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


Пример: собираем пиццу

Сравните new PizzaBuilder("большая").cheese().topping("грибы") с конструктором вида new Pizza("большая", true, ["грибы"]) — строитель говорит, что означает каждое значение, а необязательные части просто пропускаются.

Шаги, которые соединяются в цепочку

Каждый шаг имеет имя и не обязателен: маленькая пицца пропускает их все и получается с cheese: false и пустым списком добавок. Никакой каши из аргументов true, undefined, false.

Prompt
Напишите программу на TypeScript с классом PizzaBuilder: конструктор принимает размер, шаги cheese и topping возвращают сам строитель для цепочки вызовов, а build возвращает готовый объект Pizza (размер, флаг сыра, массив добавок). Соберите одну большую пиццу с сыром и двумя добавками и одну простую маленькую пиццу, затем выведите однострочное описание каждой.
Вывод: программа на TypeScript и захваченный вывод

Когда это использовать

Используйте, когда у объекта много необязательных частей или когда создание состоит из настоящих шагов, которые заслуживают имён. Запросы, выборки и конфигурации — классическая территория строителя.

Не используйте для простых объектов — объектный литерал с именованными свойствами, { size: "большая", cheese: true, toppings: [] }, уже вполне хороший маленький строитель для лёгких случаев.


Плюсы и минусы

Плюсы: читаемое создание объекта; необязательные части без огромных списков аргументов; объект можно проверить один раз, в build().

Минусы: ещё один класс, который надо написать и поддерживать; излишество там, где объектный литерал и так хорошо читается.