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