Abstract Factory

Propósito

Según el libro "Patrones de Diseño" [29] el patrón Abstract Factory "proporciona una interfaz para crear familias de objetos relacionados o que dependen entre sí, sin especificar sus clases concretas".

También conocido como

Kit

Estructura

Participantes

  • FabricaAbstracta:

    • declara una interfaz para operaciones que crean variables producto abstractas.

  • FabricaConcreta:

    • implementa las operaciones para crear variables producto concretos.

  • ProductoAbstracto:

    • declara una interfaz para un tipo de variable producto.

  • ProductoConcreto:

    • define una variable producto para que sea creado por la fábrica correspondiente.

    • implementa la interfaz ProductoAbstracto.

  • Cliente:

    • solo usa interfaces declaradas por los tipos de datos FabricaAbstracta y ProductoAbstracto.

Implementación

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

  • La FabricaAbstracta y ProductoAbstracto se definen como interfaces por simplificación.

Código de ejemplo

En este ejemplo queremos comprar distintos tipos de puertas de madera (madera o metal). Al realizar el pedido el local de venta debe encargar cada puerta a distintos fabricantes, ya que quien realiza la puerta de madera no la hace de metal y viceversa.

Implementación:

// Producto Abstracto Interface
type Puerta interface {
    VerMaterial() string
}

// Producto Concreto
type PuertaMadera struct{}

func (pm *PuertaMadera) VerMaterial() string {
    return "Madera"
}

// Producto Concreto
type PuertaMetal struct{}

func (pm *PuertaMetal) VerMaterial() string {
    return "Metal"
}

// Fábrica Abstracta Interface
type FabricaPuerta interface {
    ConstruirPuerta() Puerta
}

// Fábrica Concreta
type FabricaPuertaMadera struct{}

func (fpm *FabricaPuertaMadera) ConstruirPuerta() Puerta {
    return &PuertaMadera{}
}

// Fábrica Concreta
type FabricaPuertaMetal struct{}

func (fpm *FabricaPuertaMetal) ConstruirPuerta() Puerta {
    return &PuertaMetal{}
}

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

fabricaPuertaMadera := &FabricaPuertaMadera{}
puertaMadera := fabricaPuertaMadera.ConstruirPuerta()
fmt.Printf("Se construyo un puerta de: %s\n", puertaMadera.VerMaterial())

fabricaPuertaMetal := &FabricaPuertaMetal{}
puertaMetal := fabricaPuertaMetal.ConstruirPuerta()
fmt.Printf("Se construyo un puerta de: %s\n", puertaMetal.VerMaterial())

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?