Hay dos principales patrón singleton: fórmula perezoso y hambrientos la fórmula
// fórmula perezoso - thread-safe // en lugar de utilizar basado en la estructura de tipo struct {Tool valores int } // build variables privadas ejemplo var * Herramienta método de obtención // devuelve objeto singleton una transferencia referencia func GetInstance () * Tool { SI ejemplo == {nula ejemplo los nuevos nuevos = (Tool) } instancia de retorno }
// fórmula perezoso - flujos seguros - para realizar una operación de cierre de cada operación - no es muy alto rendimiento // en lugar de usar basado en la estructura de tipo struct {Herramienta de valores int } // acumulación privada variables de instancia var Herramienta * objeto // bloqueo var sync.Mutex Lock // únicos de adquisición objeto método devuelve una transmisión de referencia FUNC la GetInstance () {* Herramienta Lock.lock () la lock.unlock Defer () SI == ejemplo nil { instancia nueva nuevos = (Tool) } instancia de retorno }
// perezoso fórmula - doble comprobado simultáneamente // base entonces perezoso de fórmula (thread-safe) en optimizado para reducir la operación de bloqueo, no afecta el rendimiento thread-safe // en lugar de utilizar basado en la estructura de tipo struct {Herramienta de valores int } // bloqueo objeto var sync.Mutex bloqueo ejemplo var * Herramienta // primera sentencia no bloqueo, bloqueo de segundo para garantizar la seguridad de hilo, una vez creado el objeto, éste no llegaría encerrado. la GetInstance FUNC () {* Herramienta SI ejemplo nula == { Lock.lock () SI == instancia nula { instancia nueva nuevos = (herramienta) } lock.unlock () } instancia de retorno }
// hambre --init al estilo chino () para crear // flujos seguros, el único inconveniente es que se crea el objeto, mientras que la introducción de un paquete, y seguirá ocupando en la memoria del tipo de herramienta struct { } var Tool * // inicializar una ejemplos FUNC el init () { nueva herramienta nuevos = (herramienta) } // ejemplo newconfig proporciona un método de obtención de FUNC NewTool () {* Herramienta Herramienta de retorno }
// hambre de estilo chino - para crear una manera variable global // flujos seguros, el único inconveniente es que se crea el objeto, mientras que la introducción de un paquete, y seguirá ocupando la memoria
Herramienta struct {tipo } // variable global var = new nueva herramienta herramienta * (herramienta) // ejemplo newconfig proporciona un método para obtener newconfig FUNC () {* Herramienta Herramienta de retorno }
Por sync.Once Asegúrese de crear un método de objeto se ejecuta sólo una vez ---- haber comprobado el doble del efecto del juez sync.Once interna envasados
var vez sync.Once func GetInstance () * Herramienta { once.Do (func () { instancia = new (Tool) }) instancia de retorno }