Quelqu'un peut-il offrir un exemple de motif singleton et expliquer pourquoi ils sont nécessaires? P>
6 Réponses :
Avant d'aller la route Singleton, reconsidère. Avez-vous vraiment besoin d'un singleton? Si vous demandez des scénarios lorsque vous devez implémenter des singletons, c'est parce que le besoin d'eux n'exprimait pas vraiment. Vous ferez mieux d'introduire des singletons dans votre base de code simplement parce que vous êtes cool de suivre des modèles de conception.
Nettoyer les discussions de code - Etat mondial et singletons P>
Une fois n'est pas suffisant p>
Cependant, ce qui vaut vraiment la peine de savoir est Injection de dépendance . P>
MAINTENANT Si vous voulez vraiment mettre en œuvre des singletons à Java, je recommanderais à Joshua Bloch's " Java efficace " de la manière de les implémenter: p> " http: / "http: / /java.sun.com/docs/books/jls/third%5Fedition/html/execution.html#44557 "rel =" Norefer RER "> JLS garantit que la JVM n'initialisera pas l'instance jusqu'à ce que quelqu'un n'appelle note finale, le Double motif de verrouillage vérifié est cassé en Java jusqu'à Java 5 . Le modèle de mémoire Java 5 rend le fil de modèle de DCL SAFE, mais cela le rend plus lent que le EDIT: Comme @Luno a signalé, Depuis la deuxième édition du livre, la manière préférée est la suivante: P> À partir de la version 1.5, il existe une troisième approche pour mettre en œuvre des singletons. Faites simplement un type d'enum avec un élément: P>
blockQuote> Cette approche est fonctionnellement équivalente à l'approche publique sur le terrain, sauf qu'il est plus concis, fournit gratuitement les machines de sérialisation et fournit une garantie Ironclad contre plusieurs instanciations, même face à la sérialisation sophistiquée ou aux attaques de réflexion sophistiquées. Bien que cette approche n'a pas encore été largement adoptée, Un type d'énumération unique est le meilleur moyen de mettre en œuvre un singleton. Strong> p>
blockQuote> p> getinstance (); code> p>
Singletonholder Code> Méthode de classe Bien que l'intention d'origine était l'optimisation de la performance
. p>
En fait, Josh Bloch écrit que le meilleur moyen d'implémenter Singleton est d'utiliser Enum. Enum mysingletonclass {instance; } Parce que c'est une sauvegarde de fil, cela ne pose aucun problème de sérialisation, aucun risque de sécurité.
En effet, dans la deuxième édition de Java efficace, Joshua Bloch écrit que Un type d'échec à un seul élément est le meilleur moyen de mettre en œuvre un singleton b> ( informit.com/articles/article.aspx?p=1216151&eqnum=3 ).
@Luno & @Pacal: Yep thx, j'ai googlé pour un extrait et édité la réponse de l'exhaustivité
Re: Verrouillage vérifié double - Le modèle de mémoire JAVA 5 a une sémantique appropriée pour volatiles code> de telle sorte qu'il fait B> fonctionne dans les environnements de la version 5 et de l'exécution ultérieure, alors disant qu'il est cassé n'est pas cassé. plus précis. Cela dit, il y a souvent i> une meilleure façon de réaliser ses objectifs que d'utiliser DCL de toute façon ... :-)
@Andrzej thx pour le pointant sur cette sortie, j'ai édité la réponse avec une référence à IBM .Com / DeveloperWorks / Bibliothèque / J-JTP03304 / # 3.2
Quelques problèmes: (1) Heuvra dit essentiellement dans sa présentation sur l'injection de dépendance que «les États mondiaux sont mauvais» (mon interprétation). Mais comment explique-t-il des constantes nommées telles que math.pi code> et fonctions telles que
math.sin (int) code>? Comment utilise-t-on ces choses sans les états mondiaux? En outre, (2) concernant Bloch, en utilisant un énumé comme un singleton pourrait être bon pour la sérialisation, mais vous ne pouvez pas étendre une autre classe. Par exemple, disons que j'ai une classe
wizard code> et une autre classe
harrpotter étend l'assistant code> que je veux être un singleton?
harrypotter code> ne peut pas être un énumé parce que Enums ne peut pas étendre les classes.
Fondamentalement, dans Java, vous implémentez Singleton en donnant à une classe un constructeur privé de no-args privé ( Vous utiliseriez cela lorsque vous souhaitez qu'il n'y ait plus d'instance de votre classe sur toute l'application. P> MyClass privé () code>), et statiquement (ou paresseusement) initialisation d'une seule instance de la classe qui est renvoyée. par un
myClass getinstance () code> méthode. p>
' Tout simplement singleton ' à Javaworld p>
Et si vous voulez vraiment entrer dans les tranchées, commencez à lire sur "statique vs singleton" sur le groupes ou Google. Toujours un sujet brûlant pour dire le moins! p>
Danben a un assez bon résumé de ce qu'est un singleton, donc je ne le ferai pas. p>
En ce qui concerne les utilisations, les singletons sont souvent des implémentations de variables globales (qui est une mauvaise idée). Ils peuvent être utiles pour des choses comme des routeurs de messages ou des classes de gestionnaire (entre autres). P>
Un lieu souvent sous-estimé où les singletons sont bons, c'est quand vous souhaitez abstraire l'existence de l'état. Un exemple est un générateur de nombres aléatoires. Au niveau de l'abstraction, cela génère simplement des nombres aléatoires et n'a pas d'état que l'appelant doit avoir besoin de se soucier. Au niveau de la mise en œuvre, cependant, l'état est impliqué. Une autre est lorsque une fonction met en cache des résultats ou des calculs intermédiaires, mais vous souhaitez masquer ce détail de l'appelant. p>
Il y a un compromis important ici. Si vous faites des choses comme ces singletons, vous réduisez la quantité de détails de la mise en œuvre que l'appelant de votre fonction doit se soucier, ainsi que la diminution du couplage dans cette direction. Cependant, en même temps, vous avez fortement couplez votre fonction à l'objet Singleton, ce qui rend plus difficile à tester, etc. La décision de savoir si un singleton doit être effectué sur la base de quelle direction vous vous souciez de réduire davantage l'accouplement. P >
Supposez que vous n'avez qu'une seule imprimante au bureau et vous devez vous assurer qu'une classe d'imprimante n'a qu'une instance dans la principale p>
Pour accepter les réponses à vos questions, vous devez cliquer sur la coche qui apparaît en gris sous le score d'une réponse: ces marques deviendront vert ce qui signifie que vous l'avez accepté, voir Stackoverflow.com/faq