Будівельник () — шаблон проєктування, належить до класу твірних шаблонів. На відміну від шаблону абстрактної фабрики і фабричного методу, ціль яких є застосування поліморфізму, задачею шаблону будівельника є забезпечення реалізації антишаблону телескопічного (багатоступеневого) конструювання. Антишаблон «телескопічний конструктор» коли різна комбінація параметрів конструктора призводить до появи експоненційної множини конструкторів. Замість того, щоб використовувати набір конструкторів, використовують шаблон будівельник, згідно з яким використовують інший об'єкт (будівельник), що отримує на вхід вхідні параметри по одному, крок за кроком, і повертає за один прохід результуючий створений об'єкт.
Призначення Відокремлює конструювання складного об'єкта від його подання, таким чином у результаті одного й того ж процесу конструювання можуть бути отримані різні подання.
Мотивація Вам запропоновано створити систему планування екскурсій по Паттернленду — новому парку розваг. Гості парку можуть вибрати готель, замовити квитки на атракціони, зарезервувати місця в ресторані і навіть замовити спеціальні заходи. Поїздки можуть відрізнятися за кількістю днів і складу розважальної програми. Наприклад, місцевий житель не бажає зупинятися у готелі, але хоче замовити обід та спеціальні заходи. Другий гість прилітає літаком і йому необхідно забронювати номер в готелі, столик в ресторані і квитки на заходи. Таким чином, нам потрібна гнучка структура даних, яка може представляти програму поселення з усіма можливими варіаціями; крім того, побудова програми може складатися з декількох кроків.
Застосування Слід використовувати шаблон Будівельник коли: алгоритм створення складного об'єкта не повинен залежати від того, з яких частин складається об'єкт та як вони стикуються поміж собою; процес конструювання повинен забезпечити різні подання об'єкта, що конструюється.
Структура
Builder — будівельник: визначає абстрактний інтерфейс для створення частин об'єкта Product; ConcreteBuilder — конкретний будівельник: конструює та збирає докупи частини продукту шляхом реалізації інтерфейсу Builder; визначає подання, що створюється, та слідкує на ним; надає інтерфейс для доступу до продукту; Director — керівник: конструює об'єкт, користуючись інтерфейсом Builder; Product — продукт: подає складний конструйований об'єкт. ConcreteBuilder будує внутрішнє подання продукту та визначає процес його складання; вносить класи, що визначають складені частини, у тому числі інтерфейси для складання кінцевого результату з частин.
Переваги дозволяє змінювати внутрішнє представлення продукту; ізолює код, який реалізує конструювання та подання; дає тонший контроль над процесом конструювання.
Недоліки Потрібно створити окремий ConcreteBuilder для кожного окремого продукту.
Відносини клієнт створює об'єкт-управитель Director та конфігурує його потрібним об'єктом-будівником Builder; управитель повідомляє будівельника про те, що потрібно побудувати наступну частину продукту; будівельник оброблює запити управителя та додає нові частини до продукту; клієнт забирає продукт у будівельника.
Реалізація
Приклад С++
Приклад Swift
Джерела
Design Patterns implemented in Swift 2