Définition: Assurez-vous qu'une classe n'a qu'une seule instance et l'instancie elle-même et fournit cette instance à l'ensemble du système.
Type: Créer un schéma de classe de modèle de classe:
Points de connaissance du diagramme de classe:
1. Les diagrammes de classe sont divisés en trois parties, nom, attributs et méthodes.
2. Commentaires des informations commençant par << et se terminant par >>
3. Modificateur + représente le public, - représente privé, # représente protégé, rien ne représente le package visible.
4. Les attributs ou méthodes soulignés représentent statique.
5. Les amis qui ne connaissent pas la relation entre les objets du diagramme de la classe peuvent se référer à l'article: la relation entre les classes dans le modèle de conception.
Le mode singleton devrait être le mode le plus simple parmi les 23 modes de conception. Il a les éléments suivants:
Jetons un coup d'œil à un exemple simple:
package com.wolf.action; import java.util.hashmap; import java.util.map; public class Demo {public static void main (String args []) lance l'instantiationException, illégalaccessException, classnotfoundException {System.out.println (Son.getInstance (). GetName ()); System.out.println ("Qui suis-je"); }} classe Son étend le père {private String name = "Son"; Final String class = "Demo"; String protégé getName () {return this.Query ("aaa"); } public static Son getInstance () lève InstantiationException, illégalaccessException, classNotFoundException {// il doit être un chemin global, sinon renvoie (fils) instance ("com.wolf.action.son"); }} classe Père {Map statique privée <String, objet> instance = new HashMap <String, Object> (); name de chaîne privée = "classe premium"; Protected void fatcher () {System.out.println ("Je suis la classe parent"); } Protected String Query (String SQL) {return sql + "a été fait"; } public static Object Instance (String ObjName) lève InstantiationException, illégalAccessException, classNotFoundException {if (instance.get (objName) == null ||! (instance.get (objName) instanceof père)) {instance.put (objname, class.forname (objname) .newinstance ()); } return instance.get (objname); }} Le singleton est divisé en deux types selon le moment de l'instanciation de l'objet: l'un est le singleton affamé et l'autre est le singleton paresseux. Lorsque la classe singleton est chargée, le singleton instancie un objet à sa propre référence; Le style paresseux ne sera instancier de l'objet que lorsque la méthode d'instance est appelée. Le code est le suivant:
Cas unique de style homme affamé
classe publique Singleton {private static singleton singleton = new singleton (); privé singleton () {} public static singleton getInstance () {return singleton; }}Cas unique paresseux
Classe publique Singleton {Singleton Singleton privé Singleton; private singleton () {} public static synchronisé singleton getInstance () {if (singleton == null) {singleton = new singleton (); } return singleton; }}Avantages du mode singleton:
Scénarios applicables: En raison des avantages ci-dessus du mode Singleton, il s'agit d'un mode de conception qui est plus couramment utilisé dans la programmation. J'ai résumé ce que je sais des scénarios appropriés pour utiliser le mode Singleton:
Notes sur le mode singleton:
Une certaine controverse sur le modèle Singleton en Java:
Si un objet en mode singleton n'est pas utilisé pendant longtemps, sera-t-il collecté par le collecteur de déchets JVM? J'ai vu beaucoup d'informations disant: si un objet Singleton n'est pas utilisé dans la mémoire pendant longtemps, il sera considéré comme une ordure par JVM et sera nettoyé lors de la collecte des ordures. Je suis sceptique à propos de cette déclaration. Ma propre vue est: dans la version 1.6 de la machine virtuelle Hotspot, le collectionneur JVM Garbage ne recyclera pas les objets Singleton, sauf si la connexion est référencée statiquement aux objets Singleton dans le Singleton est artificiellement déconnecté.
En ce qui concerne cette controverse, l'auteur a écrit un article distinct pour en discuter. Si vous avez des opinions différentes ou si vous avez vécu cela, veuillez participer à l'article Discussion du modèle Singleton: Singleton Model et Garbage Collection participent à la discussion.
Plusieurs singletons apparaîtront-ils dans un JVM
Dans le cas de systèmes distribués, de chargeurs de classe multiples et de sérialisation, plusieurs singletons seront générés, ce qui est sans aucun doute vrai. Alors, un singleton sera-t-il généré dans le même JVM? Seule le même singleton peut être obtenu en utilisant la méthode getInstance () fournie par le singleton, à moins que la méthode de réflexion ne soit utilisée, un nouveau singleton sera obtenu. Le code est le suivant
Classe C = class.forname (singleton.class.getName ()); Constructeur CT = C.GetDeclaredConstructor (); ct.setAccessible (true); Singleton singleton = (singleton) ct.newinstance ();
De cette façon, chaque course produira un nouvel objet Singleton. Par conséquent, lorsque vous utilisez le mode Singleton, veillez à ne pas utiliser la réflexion pour générer de nouveaux objets Singleton.
Le fil de singleton paresseux est-il sûr?
Il s'agit principalement de déclarations en ligne que le motif de singleton paresseux est insérété. Même l'ajout du mot clé synchronisé à la méthode d'instanciation est toujours dangereux. Cependant, après des tests de codage, j'ai constaté qu'après avoir ajouté le mot-clé synchronisé pour le modifier, bien qu'il ait un impact partiel sur les performances, il est en file d'attente et n'instancie pas plusieurs objets.
N'y a-t-il que deux types de modes singleton: les styles affamés et paresseux?
Le singleton affamé et le singleton paresseux ne sont que deux méthodes de motif de singleton de singleton, couramment utilisés. Théoriquement, tout modèle de conception qui ne peut implémenter qu'une seule instance d'une classe peut être appelé un modèle singleton.
Les cours de singleton peuvent-ils être hérités?
Étant donné que la méthode de construction est privée, ils ne sont pas héritables, mais de nombreux autres modèles singleton peuvent être hérités, comme les singletons enregistrés.
Vaut-il mieux être un singleton affamé ou un singleton paresseux
À Java, le Singleton affamé est meilleur que le Singleton paresseux. En C ++, les singletons paresseux sont généralement utilisés.
Le modèle singleton est relativement simple, donc je ne donnerai pas d'exemple de démonstration de code ici.