Middle
Fale sobre o padrão de design 'Construtor'.
sobes.tech IA
Resposta da IA
O padrão de design "Builder" (Construtor) é um padrão de criação que permite criar objetos complexos passo a passo. Ele separa o processo de construção de um objeto complexo de sua representação, de modo que o mesmo processo de construção pode criar diferentes representações.
Componentes principais:
- Construtor (Builder): Interface ou classe abstrata que define os métodos para criar partes de um objeto complexo.
- Construtor Concreto (Concrete Builder): Implementa a interface do construtor e fornece uma implementação concreta para construir as partes do objeto. Armazena o resultado intermediário e fornece um método para obter o objeto final.
- Diretor (Director): Componente opcional. Define a ordem em que os métodos do construtor são chamados para criar o objeto. Não conhece os construtores concretos.
- Produto (Product): Objeto complexo criado pelo construtor.
Aplicações:
- Quando o processo de criação do objeto é complexo e inclui múltiplos passos opcionais.
- Quando é necessário criar diferentes representações de um mesmo objeto usando o mesmo processo de construção.
- Quando o construtor do objeto possui muitos parâmetros.
Exemplo em Go:
// Produto - objeto complexo
type Product struct {
PartA string
PartB string
PartC string
}
// Builder - interface do construtor
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// ConstrutorConcreto - construtor concreto
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Parte A construída"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Parte B construída"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Parte C construída"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Diretor - diretor (opcional)
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{builder: builder}
}
func (d *Director) Construct() {
d.builder.BuildPartA()
d.builder.BuildPartB()
d.builder.BuildPartC()
}
// Uso
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Produto criado: %+v\n", product)
Vantagens:
- Isola o código de construção do objeto do código cliente.
- Permite alterar a representação interna do produto sem modificar o código cliente.
- Permite construir o objeto passo a passo.
- Simplifica a criação de objetos com muitos parâmetros.
Desvantagens:
- Aumenta a quantidade de código (classes/interfaces) para criar o objeto.
- Pode ser redundante para objetos simples.