Назад к вопросам
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)
}

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

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

Недостатки паттерна:

  • Увеличивает количество классов в проекте.
  • Может быть избыточным для простых объектов.