Шаблон проектирования «Строитель» (Builder)
Строитель представляет собой порождающий шаблон проектирования, с помощью которого можно создать составной объект. Этот паттерн предназначается для решения проблемы антипаттерна «Телескопический конструктор».
Давайте представим, что вы зашли в McDonalds, где заказали конкретный продукт, тот же, БигМак, который вам приготовят без вопросов. Это пример шаблона «Простая фабрика». Но что, если логика создания включает в себя больше шагов? К примеру, вы желаете индивидуальный сэндвич в Subway. У вас в наличии ряд вариантов изготовления: какой хлеб, какие соусы, какой сыр? И здесь пригодится шаблон проектирования «Строитель».
Говоря проще, этот шаблон позволяет создавать разные виды объекта, избегая при этом засорения конструктора. Паттерн полезен, если возможно наличие нескольких видов объекта либо когда надо выполнить много шагов, которые связаны с его созданием.
Сделаем небольшое отступление и упомянем антипаттерн «Телескопический конструктор», о котором уже говорили:
public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true) { }
Как можно заметить, число параметров конструктора может резко увеличиться, в результате чего понимать расположение этих самых параметров станет весьма сложно. Вдобавок к этому, данный список параметров будет расти, если вы пожелаете добавить новые варианты. В результате мы и получим так называемый «Телескопический конструктор».
Теперь рассмотрим это на примере кода. Шаблон «Строитель» — хорошая альтернатива. Итак, поначалу у нас есть Burger, который мы желаем создать:
Потом мы берём «Строителя»:
А вот и пример использования:
Когда применять шаблон «Строитель»?
Паттерн используют, когда, во-первых, может быть несколько видов объекта, а во-вторых, нам надо избежать «телескопического конструктора». Основное отличие этого шаблона от «фабрики» заключается в том, что последняя используется, если создание занимает один шаг, а Builder применяется при наличии множества шагов.
Вот и всё, осталось привести пример использования этого паттерна на Java.
По материалам статьи «Design Patterns for Humans».