Le modèle Singleton est un motif de création d'objets qui garantit qu'il n'y a qu'une seule instance d'une classe dans le système.
Dans la langue java, il y a deux avantages à procéder:
1. Pour les objets fréquemment utilisés, le temps consacré à la création d'objets peut être omis;
2. En raison de la diminution du nombre de nouvelles opérations, la fréquence de l'utilisation de la mémoire du système est réduite, ce qui réduit la pression de GC et raccourcit le temps pour la pause GC.
Segmentation des modèles singleton:
1 et 1
classe publique singleton {private singleton () {System.out.println ("singleton.singleton ()"); } private static singleton singleton = new singleton (); Singleton statique public GetInstance () {return singleton; }}Remarque: Premièrement, la classe Singleton doit avoir un constructeur de niveau d'accès privé pour s'assurer que le Singleton n'est pas instancié par un autre code système; Deuxièmement, la variable de membre Singleton et la méthode getInstance () doivent être statiques.
Cette classe singleton est très simple à créer et est très fiable. Le seul inconvénient est que le singleton ne peut pas être chargé de manière latente. Par exemple, parce que le processus de création singleton est très lent et que la variable membre est définie comme statique, lorsque JVM charge la classe Singleton, l'objet Singleton sera également créé. Ensuite, un objet Singleton sera créé partout où une classe singleton est utilisée, que l'objet Singleton soit utilisé. Par exemple:
classe publique singleton {private singleton () {System.out.println ("singleton.singleton ()"); } private static singleton singleton = new singleton (); Singleton statique public GetInstance () {return singleton; } public static void Createstring () {System.out.println ("singleton.createString ()"); }} 2. Afin d'améliorer la vitesse d'appel des fonctions connexes, un mécanisme de chargement paresseux doit être introduit.
package com.luchao.singtonle; classe publique Lazysingleton {private Lazysingleton () {System.out.println ("Lazysingleton.lazysingleton ()"); } privé statique Lazysingleton LazyInstance = null; public synchronisé statique Lazysingleton getInstance () {if (lazyInstance == null) LazyInstance = new Lazysingleton (); Retour LazyInstance; }}L'attribution d'initialisation de singleton variable statique est nul, garantissant qu'il n'y a pas de charge supplémentaire au début du système. Dans la méthode getInstance (), il est déterminé que l'instance actuelle existe déjà. S'il existe, il revient. S'il n'existe pas, un singleton est créé. GetInstance () doit être une méthode synchrone, car dans un environnement multithread, lorsque le thread 1 construit un singleton et avant la fin de l'affectation, le thread 2 peut déterminer que l'instance est nul, donc le thread 2 commencera le programme pour créer un nouveau singleton, résultant en plusieurs Singletons créés.
L'exemple ci-dessus de l'implémentation de Singleton met en œuvre un chargement retardé, mais introduit une méthode de synchronisation, qui prend beaucoup plus de temps que le premier programme Singleton dans un environnement multi-thread.
3. Singleton Pattern utilise des classes internes pour maintenir la création de singletons
classe publique StateticsIngleton {private statisticsingleton () {System.out.println ("StatisticLeTon.StaticSingleton ()"); } classe statique privée singletonholder {private statique staticsingleton ataticsingleton = new statticsingleton (); } public static staticsingleton getInstance () {return singletonholder.ataticsingleton; }}Lorsque StatticsingLeton est chargé, la classe intérieure ne sera pas instanciée, garantissant que la classe singleton ne sera pas initialisée lorsque la classe Statisticsingleton est chargée dans JVM, et le singletonholder est chargé lorsque la méthode GetInstance () est appelée, initialisant ainsi l'instance. Il est également utilisé pour créer des instances lorsque la classe est chargée, il est donc naturellement adapté aux threads.
L'utilisation de classes internes pour compléter le mode à but unique peut non seulement atteindre un chargement retardé, mais également utiliser des mots clés synchrones. C'est une approche relativement complète.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous.