Quelqu'un peut-il fournir un exemple de modèle singleton et expliquer pourquoi ils sont nécessaires?Implémentation du modèle singleton en Java
Répondre
Avant d'emprunter la route singleton, reconsidérer. Avez-vous vraiment besoin d'un singleton? Si vous demandez des scénarios lorsque vous avez besoin d'implémenter des singletons, c'est parce que leur besoin ne s'est pas vraiment exprimé. Il vaut mieux ne pas introduire de singletons dans votre base de code simplement parce que c'est cool de suivre les modèles de design.
Clean Code Talks - Global State and Singletons
Cependant, ce qui est vraiment intéressant de savoir est Dependency Injection.
Maintenant, si vous voulez vraiment mettre en œuvre singletons en Java, je recommande ainsi "Effective Java" de Joshua Bloch de leur mise en œuvre:
public class Singleton
{
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private Singleton() {}
private static final class SingletonHolder {
static final Singleton instance = new Singleton();
}
}
Le JLS garantit la machine virtuelle Java ne sera pas initialiser instance jusqu'à ce que quelqu'un appelle getInstance();
Note finale, le Double Checked Locking Pattern is broken in Java up to Java 5. The Java 5 memory model makes the DCL pattern thread safe but it makes it slower than the SingletonHolder
class method while the original intent was performance optimization.
EDIT: Comme @Luno a souligné, since the second edition of the book, the preferred way is:
Avec la version 1.5, il existe une troisième approche de mise en œuvre singletons. Il suffit de faire un type ENUM avec un élément:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Cette approche est fonctionnellement équivalent à l'approche du domaine public, sauf qu'il est plus concis, fournit les mécanismes de sérialisation gratuitement et offre une garantie à toute épreuve contre l'instanciation multiple, même face à des attaques sophistiquées de sérialisation ou de réflexion. Bien que cette approche n'ait pas encore été largement adoptée, un type enum mono-élément est le meilleur moyen d'implémenter un singleton.
En fait, Josh Bloch écrit que la meilleure façon d'implémenter singleton est utiliser enum. enum MySingletonClass { INSTANCE; } Parce que c'est l'enregistrement de thread, il ne fait aucun problème avec la sérialisation, sans risques de sécurité. –
En effet, dans la deuxième édition de Effective Java, Joshua Bloch écrit que ** un type enum mono-élément est la meilleure façon d'implémenter un singleton ** (http://www.informit.com/articles/article.aspx? p = 1216151 et seqNum = 3). –
@Luno & @Pacal: yep thx, j'ai googlé pour un extrait et édité la réponse pour l'exhaustivité –
Fondamentalement, en Java vous implémentez singleton en donnant une classe d'un constructeur sans args privé (private MyClass()
), et statiquement (ou paresseusement) l'initialisation d'une seule instance de la classe qui est renvoyée par une méthode MyClass getInstance()
statique.
Vous utiliseriez ceci si vous voulez qu'il n'y ait pas plus d'une instance de votre classe dans toute l'application.
« Simply Singleton » à JavaWorld
Et si vous voulez vraiment entrer dans les tranchées, commencer la lecture sur « statique vs singleton » sur le groups ou Google il. Toujours un sujet brûlant, c'est le moins qu'on puisse dire!
danben a un assez bon résumé de ce qu'est un singleton, donc je ne vais pas le ressasser. En ce qui concerne les utilisations, les singletons sont souvent des implémentations à peine voilées de variables globales (ce qui est une mauvaise idée).Ils peuvent être utiles pour des choses comme les routeurs de messages ou les classes de gestionnaires (entre autres choses).
Un endroit souvent sous-estimé où les singletons sont bons est quand vous voulez abstraire l'existence de l'état. Un exemple est un générateur de nombres aléatoires. Au niveau de l'abstraction, il génère simplement des nombres aléatoires et n'a aucun état dont l'appelant devrait se soucier. Au niveau de la mise en œuvre, cependant, l'état est impliqué. Un autre est quand une fonction met en cache des résultats ou des calculs intermédiaires, mais vous voulez cacher ce détail à l'appelant.
Il y a un compromis significatif ici. Si vous faites des choses comme ces singletons, vous diminuez la quantité de détails d'implémentation dont l'appelant de votre fonction doit se soucier, diminuant ainsi le couplage dans cette direction. Cependant, en même temps, vous associez fortement votre fonction à l'objet singleton, ce qui rend le test plus difficile, etc. La décision d'utiliser un singleton doit être prise en fonction de la direction dans laquelle vous voulez réduire le couplage.
suppose que vous avez une seule imprimante dans le bureau et vous avez besoin Assurez-vous d'une classe d'imprimante a une seule instance
printer{
private static printer instance =null;
private printer(){}
public static printer getinst(){
if(instance==null){
instant = new printer();
}
return instance;
}
}
dans la principale
printer v=printer.geti();
- 1. modèle Singleton en C++
- 2. Implémentation de Singleton classique dans OCaml
- 3. Implémentation du modèle de commande
- 4. Implémentation du protocole OAuth en Java
- 5. Problème singleton du modèle de fournisseur
- 6. modèle Singleton + __construct dans PHP4
- 7. Implémentation DOM en Java
- 8. DI et Singleton Pattern dans une implémentation
- 9. diff implémentation en Java
- 10. Implémentation Iterable en Java
- 11. Implémentation SimHash en Java?
- 12. Implémentation du modèle atomique C++ 0x
- 13. Implémentation du modèle de producteur/consommateur en C#
- 14. Implémentation d'Atomic wait en Java
- 15. MVC code source singleton modèle
- 16. Implémentation du client - application masterserver/slaveserver java
- 17. Fonctions du modèle Mmimic C++ en Java
- 18. Singleton jetable en C#
- 19. Implémentation de la commande "système" en Java
- 20. Injection de dépendances de référentiel modèle - est-ce un singleton?
- 21. singleton class in java API
- 22. Modèle singleton dans le service d'activation Windows
- 23. OOPHP alternative appropriée au modèle singleton?
- 24. OutOfMemoryError dans une implémentation quicksort en Java
- 25. Implémentation du modèle procducer-consumer avec .NET 4.0
- 26. Modèle XML en Java
- 27. Implémentation multi-navigateurs du modèle "HTTP Streaming" (push) AJAX
- 28. Implémentation d'une liste virtuelle en Java
- 29. Implémentation de graphe de suffixe en Java
- 30. Rabin Hash Functions - Implémentation FAST en Java
Pour accepter des réponses à vos questions, vous devez cliquer sur la coche qui apparaît en gris sous le score d'une réponse: cette marque deviendra verte ce qui signifie que vous l'avez acceptée, voir http://stackoverflow.com/faq –