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

Что это такое

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

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


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

Сравните NewPizzaBuilder("большая").Cheese().Topping("грибы") с конструктором вида NewPizza("большая", true, []string{...}) — строитель сам говорит, что означает каждое значение, а необязательные части просто пропускаются.

Шаги, объединяемые в цепочку

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

Prompt
Напишите программу на Go со строителем PizzaBuilder: NewPizzaBuilder принимает размер, шаги Cheese и Topping возвращают сам строитель, чтобы вызовы можно было объединять в цепочку, а Build возвращает готовую структуру Pizza. Соберите одну большую пиццу с сыром и двумя добавками и одну простую маленькую пиццу, а затем выведите обе.
Вывод: программа на Go и захваченный вывод

Когда его применять

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

Откажитесь от него для простых структур: литерал структуры Go Pizza{size: "большая"} с именованными полями и так уже неплохой маленький строитель для лёгких случаев.


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

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

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