Design Patterns in Go
  • Portada
  • Introducción
  • Publicación
  • Parte I
    • Sobre Go
    • POO en Go
      • Objetos
      • Herencia / Composición
      • S.O.L.I.D
  • Parte II
    • Patrones de Diseño
      • GoF
      • Patrones de Comportamiento
        • Strategy
        • Chain of Responsibility
        • Command
        • Template Method
        • Memento
        • Interpreter
        • Iterator
        • Visitor
        • State
        • Mediator
        • Observer
      • Patrones Creacionales
        • Singleton
        • Builder
        • Factory Method
        • Abstract Factory
        • Prototype
      • Patrones Estructurales
        • Composite
        • Adapter
        • Bridge
        • Proxy
        • Decorator
        • Facade
        • Flyweight
  • Parte III
    • Conclusiones
    • Acerca De
  • Recursos de interés
  • Glosario
Con tecnología de GitBook
En esta página
  • Propósito
  • Estructura
  • Participantes
  • Implementación
  • Código de ejemplo

¿Te fue útil?

  1. Parte II
  2. Patrones de Diseño
  3. Patrones Creacionales

Singleton

AnteriorPatrones CreacionalesSiguienteBuilder

Última actualización hace 5 años

¿Te fue útil?

Propósito

Según el libro "Patrones de Diseño" el patrón Singleton "garantiza que una clase solo tenga una instancia, y proporciona un punto de acceso global a ella".

Estructura

Participantes

  • Singleton:

    • define una operación instancia que permite que los clientes accedan a su única variable.

    • puede ser responsable de crear su única variable en memoria.

Implementación

  • No se observan impedimentos para la implementación del patrón en Go.

  • Al no existir método y propiedades estáticas en Go es necesario utilizar programación funcional para poder implementar el patrón.

Código de ejemplo

Implementación:

// Singleton
type Singleton struct {
    Tiempo int64
}

// Creador "estático"
var instancia *Singleton
var once sync.Once

func GetInstancia() *Singleton {
    once.Do(func() {
        instancia = &Singleton{
            time.Now().Unix(),
        }
    })

    return instancia
}

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

fmt.Println("Todas las instancias Singleton tienen que tener el mismo número")

fmt.Printf("Instancia Singleton: %d\n", GetInstancia().Tiempo)

time.Sleep(1 * time.Second)

fmt.Printf("Instancia Singleton: %d\n", GetInstancia().Tiempo)

canalEspera := make(chan int64)

go func() {
    time.Sleep(1 * time.Second)

    canalEspera <- GetInstancia().Tiempo
}()

fmt.Printf("Instancia Singleton: %d\n", <-canalEspera)

Dado que Go permite la programación concurrente en diferentes subprocesos de ejecución, no es posible garantizar una única variable del tipo de dato si no se toman recaudos adicionales. Para asegurar que solo existirá una variable del tipo de dato se deberá hacer uso de la librería estándar de Go. Concretamente el método de la estructura garantiza que la función pasada como parámetro puede ser ejecutada una única vez mientras dure la ejecución del programa. Esta función será la encargada de crear la única variable del tipo de dato Singleton.

|

Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en

sync
Do
Once
Código de ejemplo
Ejecutar código
https://leanpub.com/designpatternsingo
[29]