Il y a deux principaux motifs de singleton: formule paresseux et mourir de faim la formule
// formule paresseux - threads // au lieu d'utiliser basée sur la structure struct type {outil valeurs int } // build variables privées exemple var * Outil procédé d'obtention // singleton objet retourne un transfert de référence func GetInstance () * Outil { SI exemple == {nul exemple NOUVEAUTÉSNouveaux = (Tool) } d'instance de retour }
// formule paresseuse - thread-safe - pour effectuer une opération de blocage de chaque opération - n'est pas très haute performance // au lieu d'utiliser basée sur la structure struct type {outil valeurs int } // Variables de construction privée instance var outil * // objet de verrouillage var sync.Mutex verrouillage // singleton méthode retourne d'acquisition objet d' une transmission de référence FUNC le GetInstance () {* outil serrure.Serrure () le lock.unlock defer () SI == exemple nulle { exemple nouvelle nouvelle = (Tool) } d'instance de retour }
// paresseux formule - deux vérifiés simultanément // puis paresseux base de formule (thread-safe) sur optimisé pour réduire l'opération de verrouillage, n'a aucune incidence sur les performances de threads // au lieu d'utiliser basée sur la structure struct type {Outil de valeurs int } // objet serrure var verrouillage sync.Mutex outil instance var * // premier jugement n'a pas de verrouillage, deuxième verrou pour assurer la sécurité du fil, une fois que l'objet est créé, l'objet ne s'enfermé. la GetInstance FUNC () {* outil IF exemple nul == { serrure.Serrure () SI == {exemple nulle instance nouvelle nouvelle = (Tool) } lock.unlock () } instance de retour }
// faim fonction --init chinoise de style () pour créer // thread-safe, le seul inconvénient est que l'objet est créé tout en introduisant un paquet, et continuer à occuper dans la mémoire du type struct outil { } var outil outil * // initialize une exemples FUNC init () { outil new new = (Tool) } // exemple newconfig fournit un procédé d'obtention FUNC NewTool () {* outil retour outil }
// faim de style chinois - de créer une manière globale variable // thread-safe, le seul inconvénient est que l'objet est créé tout en introduisant un paquet, et continuer à occuper la mémoire
struct outil {type } // variable globale var = new nouvel outil outil * (Tool) // exemple newconfig fournit un procédé d'obtention FUNC newconfig () {* outil retour outil }
En sync.Once assurez-vous de créer une méthode d'objet est exécuté une seule fois ---- ont revérifié l'effet du juge emballé sync.Once interne
var une fois sync.Once func GetInstance () * outil { once.Do (func () { exemple = new (Tool) }) instance de retour }