Existem dois principais padrão Singleton: Fórmula preguiçoso e morrendo de fome a fórmula
// fórmula preguiçoso - isenta de segmentos // em vez de utilizar com base na estrutura tipo struct {Ferramenta valores int } // compilação variáveis particulares var exemplo * Ferramenta método de obtenção de objectos únicos // retorna uma transferência de referência func GetInstance () * Ferramenta { IF exemplo == {nil exemplo de novos novos = (Tool) } instância retorno }
// fórmula preguiçoso - isenta de segmentos - de realizar uma operação de fecho de cada operação - não é muito alto desempenho // em vez de utilizar com base na estrutura tipo struct {Ferramenta valores int } // compilação particular variáveis var exemplo Ferramenta * // bloqueio objecto var sync.Mutex bloqueio // únicas de aquisição objeto método retorna uma transmissão de referência FUNC o GetInstance () {* Ferramenta Lock.lock () o lock.unlock defer () IF == exemplo nil { exemplo de novos novos = (Tool) } instância retorno }
// fórmula preguiçoso - verificados duas vezes simultaneamente // base, em seguida, preguiçoso de fórmula (isenta de segmentos) sobre optimizado para reduzir a operação de fecho, não afecta o desempenho do fio de segurança // em vez de utilizar com base na estrutura tipo struct {Ferramenta valores int } // bloqueio objeto var bloqueio sync.Mutex var exemplo * Ferramenta // primeiro julgamento não bloqueio, segundo bloqueio para garantir a segurança do segmento, uma vez que o objeto é criado, o objeto não iria ficar preso. o GetInstance FUNC () {* Ferramenta IF exemplo nil == { Lock.lock () IF == exemplo nil { exemplo de novos novos = (ferramenta) } lock.unlock () } instância retorno }
// fome --init de estilo chinês () função para criar // thread-safe, o único inconveniente é que o objeto é criado enquanto a introdução de um pacote, e continuam a ocupar na memória do tipo struct Ferramenta { } var Ferramenta Ferramenta * // inicializar um exemplos FUNC o init () { nova ferramenta novos = (ferramenta) } // exemplo newconfig fornece um método de obtenção de FUNC NewTool () {* Ferramenta Ferramenta de retorno }
// fome de estilo chinês - para criar uma forma variável global // thread-safe, o único inconveniente é que o objeto é criado enquanto a introdução de um pacote, e continuam a ocupar memória
Ferramenta struct {type } // variável global var = new nova ferramenta ferramenta * (Ferramenta) // exemplo newconfig fornece um método de obtenção newconfig FUNC () {* Ferramenta ferramenta de retorno }
Por sync.Once certifique-se de criar um método de objeto é executada apenas uma vez ---- dobro verificado o efeito do juiz sync.Once interna embalados
var uma vez sync.Once func GetInstance () * Ferramenta { once.Do (func () { instance = new Tool) ( }) instância de retorno }