Назад к вопросам
Middle
76
questionbank

Что такое строитель (Builder) в контексте разработки программного обеспечения?

Sobes Copilot

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

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

sobes.tech 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("Thin crust");
    }

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

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // Margherita doesn't have extra toppings by default
    }

    @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();
        // Additional toppings can be added here based on pizza type or requirements
    }
}

// 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);
    }
}

Применяется, когда:

  • Необходимо создавать сложный объект с множеством необязательных параметров.
  • Процесс создания объекта является последовательным и включает множество шагов.
  • Требуется создание различных вариаций одного и того же объекта, используя один и тот же алгоритм конструирования.
  • Необходимо избежать конструктора с большим количеством параметров ("telescoping constructor").

Преимущества:

  • Улучшает читаемость и поддерживаемость кода.
  • Обеспечивает гибкость в создании объектов.
  • Позволяет создавать неизменяемые объекты.
  • Избавляет от необходимости большого количества конструкторов.

Недостатки:

  • Может увеличить количество классов в проекте (для каждого типа объекта и каждого строителя).
  • Требует некоторого начального усилия на проектирование.