Что такое паттерн проектирования Строитель (Builder)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн проектирования Строитель (Builder) — это порождающий паттерн, который позволяет создавать сложные объекты пошагово. Он отделяет процесс конструирования объекта от его представления, позволяя использовать один и тот же процесс конструирования для получения различных представлений объекта.
Ключевые особенности:
- Отделение конструирования от представления: Сам алгоритм создания объекта не зависит от конкретных деталей создаваемого объекта.
- Пошаговое создание: Объект создается путем вызова последовательности методов строителя.
- Различные вариации объекта: Один и тот же строитель может использоваться для создания объектов с разным составом или конфигурацией.
- Использование Director (Необязательно): Объект Director может управлять процессом построения, определяя последовательность вызовов методов строителя.
Структура паттерна:
- Builder: Интерфейс или абстрактный класс, определяющий методы для построения различных частей объекта.
- ConcreteBuilder: Реализует интерфейс Builder и предоставляет специфическую реализацию для построения конкретного типа объекта. Содержит методы для создания частей объекта и метод для получения построенного объекта.
- Product: Сложный объект, который строится.
- Director (Необязательно): Класс, который использует объект Builder для создания Product. Определяет порядок вызовов методов Builder.
Преимущества:
- Позволяет создавать объекты с большим количеством необязательных параметров, избегая "телескопического конструктора" (множества конструкторов с разным набором параметров).
- Позволяет изменять внутреннее представление объекта без изменения клиента, использующего Builder.
- Облегчает добавление новых типов построения.
- Улучшает читаемость и сопровождаемость кода при создании сложных объектов.
Недостатки:
- Увеличивает количество классов в проекте.
- Может быть избыточен для простых объектов.
Пример использования:
Представьте создание объекта "Автомобиль" с различными опциями (двигатель, цвет, коробка передач и т.д.). Вместо множества конструкторов, мы можем использовать Builder для пошагового конфигурирования автомобиля.
// Product
class Car {
private String engine;
private String color;
private String transmission;
public void setEngine(String engine) {
this.engine = engine;
}
public void setColor(String color) {
this.color = color;
}
public void setTransmission(String transmission) {
this.transmission = transmission;
}
@Override
public String toString() {
return "Car{" +
"engine='" + engine + '\'' +
", color='" + color + '\'' +
", transmission='" + transmission + '\'' +
'}';
}
}
// Builder
interface CarBuilder {
void buildEngine(String engine);
void buildColor(String color);
void buildTransmission(String transmission);
Car getResult();
}
// ConcreteBuilder
class SportCarBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine(String engine) {
car.setEngine(engine);
}
@Override
public void buildColor(String color) {
car.setColor(color);
}
@Override
public void buildTransmission(String transmission) {
car.setTransmission(transmission);
}
@Override
public Car getResult() {
return car;
}
}
// Client (или Director)
class CarManufacturing {
public Car constructSportCar(CarBuilder builder) {
builder.buildEngine("V8");
builder.buildColor("Red");
builder.buildTransmission("Automatic");
return builder.getResult();
}
}
В этом примере Car - это Product, CarBuilder - это Builder, SportCarBuilder - это ConcreteBuilder, а CarManufacturing может выступать в роли Director.