Sobes.tech
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.