Middle
Cuente sobre el patrón de diseño 'Constructor'.
sobes.tech AI
Respuesta de la IA
El patrón de diseño "Builder" (Constructor) es un patrón creacional que permite crear objetos complejos paso a paso. Separa el proceso de construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción puede crear diferentes representaciones.
Componentes principales:
- Constructor (Builder): Interfaz o clase abstracta que define los métodos para crear partes de un objeto complejo.
- Constructor Concreto (Concrete Builder): Implementa la interfaz del Constructor y proporciona una implementación concreta para construir las partes del objeto. Almacena el resultado intermedio y proporciona un método para obtener el objeto final.
- Director (Director): Componente opcional. Define el orden en que se llaman los métodos del constructor para crear el objeto. No conoce los constructores concretos.
- Producto (Product): Objeto complejo que se crea mediante el constructor.
Aplicaciones:
- Cuando el proceso de creación del objeto es complejo e incluye múltiples pasos opcionales.
- Cuando se necesitan crear diferentes representaciones de un mismo objeto, usando el mismo proceso de construcción.
- Cuando el constructor del objeto tiene muchos parámetros.
Ejemplo en Go:
// Producto - objeto complejo
type Product struct {
PartA string
PartB string
PartC string
}
// Builder - interfaz del constructor
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// ConstructorConcreto - constructor concreto
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Parte A construida"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Parte B construida"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Parte C construida"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Director - director (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("Producto creado: %+v\n", product)
Ventajas:
- Aísla el código de construcción del objeto del código cliente.
- Permite cambiar la representación interna del producto sin modificar el código cliente.
- Permite construir el objeto paso a paso.
- Simplifica la creación de objetos con muchos parámetros.
Desventajas:
- Aumenta la cantidad de código (clases/interfaces) para crear el objeto.
- Puede ser redundante para objetos simples.