Назад к вопросам
Junior
115
questionbank

В чем заключается суть паттерна проектирования Builder?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Builder — это порождающий паттерн, который позволяет пошагово создавать сложные объекты, отделяя процесс конструирования от его представления. Он предоставляет интерфейс для пошагового построения объекта, а различные конкретные строители (Concrete Builders) реализуют этот интерфейс для создания различных представлений одного и того же объекта.

Суть Builder в следующем:

  • Пошаговое построение: Вместо одного большого конструктора или фабричного метода, Builder разбивает процесс создания объекта на отдельные шаги.
  • Отделение процесса от представления: Клиент взаимодействует с Builder'ом, чтобы создать объект, но не знает деталей его внутренней структуры или порядка сборки.
  • Гибкость: Позволяет создавать различные варианты объекта с использованием одного и того же строительного процесса, просто меняя Concrete Builder.
  • Избегание Telescoping Constructor: Решает проблему наличия множества конструкторов с разным количеством параметров, что делает код более читаемым и поддерживаемым.

Пример: Создание объекта Pizza с различными ингредиентами.

// Интерфейс Builder'а
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildTopping();
    Pizza getPizza();
}

// Конкретный Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    @Override
    public void buildDough() {
        pizza.setDough("thin crust");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("tomato");
    }

    @Override
    public void buildTopping() {
        pizza.setTopping("mozzarella");
    }

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

// Объект, который строится
class Pizza {
    private String dough;
    private String sauce;
    private String topping;

    public void setDough(String dough) {
        this.dough = dough;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    public void setTopping(String topping) {
        this.topping = topping;
    }

    @Override
    public String toString() {
        return "Pizza{" +
               "dough='" + dough + '\'' +
               ", sauce='" + sauce + '\'' +
               ", topping='" + topping + '\'' +
               '}';
    }
}

// Директор (опционально), управляет процессом построения
class Director {
    public void constructMargherita(PizzaBuilder builder) {
        builder.buildDough();
        builder.buildSauce();
        builder.buildTopping();
    }
}

// Клиентский код
public class Main {
    public static void main(String[] args) {
        Director director = new Director();
        PizzaBuilder builder = new MargheritaPizzaBuilder();
        director.constructMargherita(builder);
        Pizza pizza = builder.getPizza();
        System.out.println(pizza); // Вывод: Pizza{dough='thin crust', sauce='tomato', topping='mozzarella'}
    }
}

В данном примере PizzaBuilder определяет шаги построения пиццы. MargheritaPizzaBuilder реализует эти шаги для создания пиццы "Маргарита". Director (здесь простой) координирует процесс построения. Клиент не напрямую создает объект Pizza, а использует Builder.