Builder

Propósito

Según el libro "Patrones de Diseño" [29] el patrón Builder "separa la construcción de un objeto complejo de su representación, de forma que el mismo proceso de construcción pueda crear diferentes representaciones".

Estructura

Participantes

  • Constructor:

    • especifica una interfaz abstracta para crear las partes de una variable Producto.

  • ConstructorConcreto:

    • implementa la interfaz de Constructor para construir y ensamblar las partes del producto.

    • proporciona una interfaz para devolver el producto.

  • Director:

    • construye una variable usando la interfaz Constructor.

  • Producto:

    • representa una variable compleja en construcción. El ConstructorConcreto construye la representación interna del producto y define el proceso de ensamble.

    • incluye los tipos de datos que definen sus partes constituyentes, incluyendo interfaces para ensamblar las partes en el resultado final.

Implementación

  • No se observan impedimentos y/o modificaciones de la estructura original del patrón para su implementación en Go.

  • El Constructor se define como interface por simplificación.

Código de ejemplo

En este ejemplo queremos que un local de comida pueda entregar distintos tipos de hamburguesas (simples y dobles) para lo que será necesario generar distintos constructores de hamburguesas.

Implementación:

// Interface Constructor
type Constructor interface {
    EstablecerTamanio()
    Construir() *Hamburguesa
}

// Constructor Concreto
type ConstructorHamburguesaSimple struct {
    tamanio string
}

func (chs *ConstructorHamburguesaSimple) EstablecerTamanio() {
    chs.tamanio = "Simple"
}

func (chs *ConstructorHamburguesaSimple) Construir() *Hamburguesa {
    return &Hamburguesa{chs.tamanio}
}

// Constructor Concreto
type ConstructorHamburguesaDoble struct {
    tamanio string
}

func (chd *ConstructorHamburguesaDoble) EstablecerTamanio() {
    chd.tamanio = "Doble"
}

func (chd *ConstructorHamburguesaDoble) Construir() *Hamburguesa {
    return &Hamburguesa{chd.tamanio}
}

// Producto
type Hamburguesa struct {
    Tamanio string
}

// Director
type LocalComida struct{}

func (lc *LocalComida) ConstruirHamburguesa(constructor Constructor) *Hamburguesa {
    constructor.EstablecerTamanio()

    return constructor.Construir()
}

Se puede probar la implementación del patrón de la siguiente forma:

localComida := &LocalComida{}

hamburguesaA := localComida.ConstruirHamburguesa(&ConstructorHamburguesaSimple{})
hamburguesaB := localComida.ConstruirHamburguesa(&ConstructorHamburguesaDoble{})

fmt.Printf("Se solicito una hamburguesa: %s\n", hamburguesaA.Tamanio)
fmt.Printf("Se solicito una hamburguesa: %s\n", hamburguesaB.Tamanio)

Código de ejemplo | Ejecutar código

Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en https://leanpub.com/designpatternsingo

Última actualización

¿Te fue útil?