В чем заключается суть паттерна проектирования 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.