Sobes.tech
Middle

Бунёдкор (Builder) дар контексти рушд додани нармафзор чист?

sobes.tech AI

Ҷавоб аз AI

Шаблон проектування, який відокремлює конструювання складного об'єкта від його представлення, дозволяючи створювати різні представлення одного й того самого процесу побудови.

Ключові особливості:

  • Розділення відповідальності: Логіка створення об'єкта (кроки конструювання) та представлення об'єкта (кінцевий продукт) розділені.
  • Покрокове конструювання: Об'єкт створюється крок за кроком, що робить процес створення більш гнучким і зрозумілим.
  • Різні представлення: Один і той самий процес конструювання може використовуватися для створення різних варіацій об'єкта.
  • Інкапсуляція: Деталі створення об'єкта приховані від клієнта, що спрощує його використання.

Основні учасники:

  • Builder (Будівельник): Абстрактний інтерфейс або клас, який визначає кроки для створення частин продукту.
  • ConcreteBuilder (Конкретний будівельник): Конкретна реалізація Будівельника, яка виконує фактичне конструювання частин продукту та зберігає результат.
  • Director (Директор): Клас, який використовує об'єкт ConcreteBuilder для конструювання продукту, викликаючи відповідні методи будівельника у визначеній послідовності.
  • Product (Продукт): Складний об'єкт, який будується.

Приклад використання:

Створення об'єкта Pizza з різними інгредієнтами:

// Product
class Pizza {
    private String dough;
    private String sauce;
    private String cheese;
    private List<String> toppings;

    public void setDough(String dough) { this.dough = dough; }
    public void setSauce(String sauce) { this.sauce = sauce; }
    public void setCheese(String cheese) { this.cheese = cheese; }
    public void addTopping(String topping) {
        if (toppings == null) {
            toppings = new ArrayList<>();
        }
        toppings.add(topping);
    }

    @Override
    public String toString() {
        return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
    }
}

// Builder interface
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getResult();
}

// ConcreteBuilder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
    }

    @Override
    public void buildDough() {
        pizza.setDough("Тонка корка");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Томатний соус");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Моцарела");
    }

    @Override
    public void addTopping(String topping) {
        // Margherita не має додаткових інгредієнтів за замовчуванням
    }

    @Override
    public Pizza getResult() {
        return pizza;
    }
}

// Director
class Cook {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Додаткові інгредієнти можна додати тут залежно від типу або вимог піци
    }
}

// Client code
public class PizzaShop {
    public static void main(String[] args) {
        Cook cook = new Cook();
        PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

        cook.setPizzaBuilder(margheritaBuilder);
        cook.constructPizza();

        Pizza pizza = margheritaBuilder.getResult();
        System.out.println(pizza);
    }
}

Застосовується, коли:

  • Необхідно створювати складний об'єкт з багатьма необов'язковими параметрами.
  • Процес створення об'єкта є послідовним і включає багато кроків.
  • Потрібно створити різні варіації одного й того самого об'єкта, використовуючи один і той самий алгоритм конструювання.
  • Необхідно уникнути конструктора з великою кількістю параметрів ("телескопічний конструктор").

Переваги:

  • Покращує читабельність і підтримуваність коду.
  • Забезпечує гнучкість у створенні об'єктів.
  • Дозволяє створювати незмінні об'єкти.
  • Позбавляє від необхідності великої кількості конструкторів.

Недоліки:

  • Може збільшити кількість класів у проекті (для кожного типу об'єкта та кожного будівельника).
  • Вимагає деяких початкових зусиль на проектування.