Назад к вопросам
Middle
106
questionbank
Расскажи о паттерне проектирования Builder (Строитель).
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Builder — это порождающий паттерн, который позволяет создавать сложные объекты пошагово.
Применяется, когда:
- Процесс создания объекта сложный и включает множество шагов.
- Необходимо создавать различные представления одного и того же объекта.
- Конструктор объекта имеет большое количество необязательных параметров.
Паттерн состоит из следующих ролей:
- Builder: Интерфейс, определяющий шаги построения объекта.
- ConcreteBuilder: Конкретная реализация Builder, выполняющая шаги построения и предоставляющая метод получения готового объекта.
- Product: Сложный объект, который строится.
- Director (Необязательно): Определяет порядок вызова шагов построения.
Пример реализации на Golang без Director:
// Product - объект, который мы строим
type Pizza struct {
Dough string
Sauce string
Toppings []string
}
// Builder - интерфейс строителя
type PizzaBuilder interface {
SetDough(dough string) PizzaBuilder
SetSauce(sauce string) PizzaBuilder
AddTopping(topping string) PizzaBuilder
Build() Pizza // Метод получения готового объекта
}
// ConcreteBuilder - конкретная реализация строителя
type HawaiianPizzaBuilder struct {
pizza Pizza
}
func NewHawaiianPizzaBuilder() *HawaiianPizzaBuilder {
return &HawaiianPizzaBuilder{}
}
func (b *HawaiianPizzaBuilder) SetDough(dough string) PizzaBuilder {
b.pizza.Dough = dough
return b
}
func (b *HawaiianPizzaBuilder) SetSauce(sauce string) PizzaBuilder {
b.pizza.Sauce = sauce
return b
}
func (b *HawaiianPizzaBuilder) AddTopping(topping string) PizzaBuilder {
b.pizza.Toppings = append(b.pizza.Toppings, topping)
return b
}
func (b *HawaiianPizzaBuilder) Build() Pizza {
return b.pizza
}
// Пример использования
func main() {
// Создаем строителя для гавайской пиццы
builder := NewHawaiianPizzaBuilder()
// Строим пиццу пошагово
pizza := builder.
SetDough("тонкое").
SetSauce("томатный").
AddTopping("ананас").
AddTopping("ветчина").
Build() // Получаем готовую пиццу
fmt.Printf("Создана пицца: %+v\n", pizza)
}
Преимущества паттерна:
- Позволяет изолировать процесс построения сложного объекта от его представления.
- Обеспечивает пошаговое создание объекта.
- Упрощает создание различных представлений одного и того же объекта.
- Делает код создания объекта более читаемым и поддерживаемым при большом количестве параметров.
Недостатки паттерна:
- Увеличивает количество классов в проекте.
- Может быть избыточным для простых объектов.