58 votes

But des singletons dans la programmation

Ce n'est certes plutôt lâche question. Ma compréhension actuelle de singletons, c'est qu'ils sont une classe que vous avez mis en place de telle façon qu'une seule instance est jamais créé.

Cela sonne un peu comme une classe statique pour moi. La principale différence étant qu'avec une classe statique vous n'avez pas / ne peut pas exemple, il vous suffit de l'utiliser comme Math.pi(). Avec une classe singleton, vous auriez encore besoin de faire quelque chose comme

singleton mySingleton = new singleton();
mysingleton.set_name("foo");
singleton otherSingleton = new singleton();
// correct me if i am wrong, but mysingleton == othersingleton right now, yes?
// this the following should happen?
otherSingleston.set_name("bar");
mysingleton.report_name(); // will output "bar" won't it?

Veuillez noter que je me suis poser cette langue de manière indépendante, à propos de ce concept. Donc, je ne suis pas inquiet sur le fait comment le code de cette classe, mais plus pourquoi vous wan pas et que tout ce que vous devez considérer.

57voto

Michael Borgwardt Points 181658

Le principal avantage d'un singleton sur une catégorie composée de la statique est, que vous pourrez ensuite décider facilement que vous avez besoin, en fait, plus d'un exemple, par exemple un par thread.

Cependant, dans la pratique, le but principal de singletons est de rendre les gens se sentent moins mauvais propos avoir des variables globales.

Un exemple pratique pour une bonne utilisation d'un singleton: vous disposez d'une application qui utilise une base de données SQL et vous avez besoin d'un pool de connexions. Le but de cette piscine est de réutiliser DB connexion, si vous voulez absolument tous les clients d'utiliser la même piscine. Ainsi, ayant comme un singleton est de la bonne conception. Mais un jour, vous avez besoin de l'application pour se connecter à un deuxième serveur de base de données, et de réaliser que vous ne pouvez pas avoir des connexions à des serveurs différents dans la même piscine. Donc votre "une instance globale" singleton "devient" une instance par serveur de base de données".

14voto

balu Points 738

pourquoi vous wan pas à

Je ne le ferais pas parce singletons généralement de très mauvaise façon de résoudre vos problèmes. Je vous recommande de les éviter complètement.

Les principales raisons sont:

  • Les Singletons représentent principalement de l'état global (ce qui est mal).
  • Corriger l'injection de dépendance devient impossible.

Je vous suggère de lire le reste (y compris des explications exhaustives) à cet employé de Google du blog:

4voto

Joris Timmermans Points 8075

Comme d'autres l'ont dit:

  • Les Singletons sont des variables globales par un autre nom.
  • Les Singletons sont généralement une mauvaise idée.
  • Les Singletons pourrait être remplacé par "monostate" classes - les classes qui ont apparemment normales de la construction / destruction de la sémantique, mais tous partagent le même état.

Notez que, à mon avis, "les classes statiques" sont généralement aussi une mauvaise idée, une hackish solution de contournement pour un langage qui ne permet pas de fonctions libres, ou pour l'état de partage entre un tas de fonctions sans vouloir passer l'état en tant que paramètre.

Dans mon expérience, presque tous les modèles avec des singletons ou de classes statiques peut être transformé en quelque chose de mieux, plus compréhensible et plus souple par se débarrasser de ces constructions.

Edit: Par demande, pourquoi la plupart des singletons sont des variables globales par un autre nom.

Dans la plupart des langues que je connais, la plupart des classes singleton sont accessibles par une fonction membre statique de la classe. La seule instance est disponible pour tout le code qui a accès à la définition de la classe singleton. C'est une variable globale - tous les code qui inclut la classe peut apporter des modifications à l'instance unique de votre singleton.
Si vous n'utilisez pas la fonction membre statique (ou statique méthode de fabrique qui a les mêmes conséquences), mais au lieu de passer l'objet singleton à tous les clients qui en ont besoin, alors vous n'avez pas besoin de le pattern singleton, il suffit de passer le même objet pour tous les clients.

2voto

Marcelo Cantos Points 91211

Les singletons sont surtout utiles lorsque vous voulez une interface vers un service singleton, mais vous ne savez pas avant le lancement quelle classe concrète sera instanciée.

Par exemple, vous voudrez peut-être déclarer un service de journalisation centralisé, mais décider uniquement au moment de l'exécution si vous souhaitez connecter un enregistreur de fichiers, un enregistreur de stub, un enregistreur de base de données ou un enregistreur de file d'attente de messages.

2voto

baris_a Points 986

Un peu de connaissance est une chose dangereuse et les Singletons sont dangereux entités. En plus de l'écrit ci-dessus, je peut souligner que la durée de vie de la gestion des objets Singleton sont également importants. Dans ACE cadre, il est manipulé correctement. Vous pouvez trouver ce livre ici: http://www.cs.wustl.edu/~schmidt/PDF/ObjMan.pdf

Veuillez également noter que les singletons doit être non-copiable classes. Ce modèle peut sembler être la plus facile, mais, au contraire, c'est l'un des difficile. Par conséquent, je demande aux candidats au sujet de ce mal de points dans les Singletons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X