Sobes.tech
Middle
137
questionbank

Расскажите о паттерне проектирования 'Строитель'.

Ответ от нейросети

sobes.tech AI

Паттерн проектирования "Строитель" (Builder) — это порождающий паттерн, который позволяет создавать сложные объекты пошагово. Он отделяет процесс конструирования сложного объекта от его представления, так что один и тот же процесс строительства может создавать различные представления.

Основные компоненты:

  • Строитель (Builder): Интерфейс или абстрактный класс, определяющий методы для создания частей сложного объекта.
  • Конкретный Строитель (Concrete Builder): Реализует интерфейс Строителя и предоставляет конкретную реализацию для построения частей объекта. Хранит промежуточный результат и предоставляет метод для получения готового объекта.
  • Директор (Director): Необязательный компонент. Определяет порядок вызова методов строителя для создания объекта. Не знает о конкретных строителях.
  • Продукт (Product): Сложный объект, который создается строителем.

Применение:

  • Когда процесс создания объекта является сложным и включает множество необязательных шагов.
  • Когда необходимо создавать различные представления одного и того же объекта, используя один и тот же процесс строительства.
  • Когда конструктор объекта имеет большое количество параметров.

Пример на Go:

// Product - сложный объект
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Builder - интерфейс строителя
type Builder interface {
	BuildPartА()
	BuildPartВ()
	BuildPartС()
	GetProduct() *Product
}

// ConcreteBuilder - конкретный строитель
type ConcreteBuilder struct {
	product *Product
}

func NewConcreteBuilder() *ConcreteBuilder {
	return &ConcreteBuilder{product: &Product{}}
}

func (cb *ConcreteBuilder) BuildPartА() {
	cb.product.PartA = "Часть А построена"
}

func (cb *ConcreteBuilder) BuildPartВ() {
	cb.product.PartB = "Часть B построена"
}

func (cb *ConcreteBuilder) BuildPartС() {
	cb.product.PartC = "Часть C построена"
}

func (cb *ConcreteBuilder) GetProduct() *Product {
	return cb.product
}

// Director - директор (опционально)
type Director struct {
	builder Builder
}

func NewDirector(builder Builder) *Director {
	return &Director{builder: builder}
}

func (d *Director) Construct() {
	d.builder.BuildPartА()
	d.builder.BuildPartВ()
	d.builder.BuildPartС()
}

// Использование
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Продукт создан: %+v\n", product)

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

  • Изолирует код построения объекта от его клиентского кода.
  • Позволяет изменять внутреннее представление продукта без изменения клиентского кода.
  • Позволяет пошагово строить объект.
  • Упрощает создание объектов с большим количеством параметров.

Недостатки:

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