Назад к вопросам
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").
Преимущества:
- Улучшает читаемость и поддерживаемость кода.
- Обеспечивает гибкость в создании объектов.
- Позволяет создавать неизменяемые объекты.
- Избавляет от необходимости большого количества конструкторов.
Недостатки:
- Может увеличить количество классов в проекте (для каждого типа объекта и каждого строителя).
- Требует некоторого начального усилия на проектирование.