web-dev-qa-db-fra.com

Pourquoi Singleton est-il considéré comme un anti-modèle?

Duplicate possible:
Quel est le problème des Singletons?

Singleton Design Pattern: Pièges

Singleton anti-pattern

J'ai entendu dire récemment que Singleton est un anti-modèle. Je sais que cela a à voir avec le fait de faire un singleton de classe, c'est comme faire de cette instance unique une variable globale, mais c'est aussi beaucoup plus que cela (limiter le nombre d'instances de cet objet, gérer l'instanciation, etc.).

Pourquoi Singleton est-il considéré comme un anti-modèle? Et quelles sont les alternatives?

69
user1710031

Pour vous aider à répondre, voici plus d'informations sur le commentaire anti-pattern:

il est utilisé de manière excessive, introduit des restrictions inutiles dans les situations où une seule instance d'une classe n'est pas réellement requise et introduit un état global dans une application

De: http://en.wikipedia.org/wiki/Singleton_pattern

Pour plus d'informations à ce sujet, vous pouvez consulter: https://www.michaelsafyan.com/tech/design/patterns/singleton

Voici une excellente conclusion au blog ci-dessus:

En bref, le modèle singleton rend le code plus complexe, moins utile et constitue une réelle difficulté à réutiliser ou à tester. L’élimination des singletons peut être délicate, mais c’est une entreprise qui en vaut la peine.

OK, donc, la raison pour laquelle il s'agit d'un anti-motif est bien décrite dans ce paragraphe et, comme le dit l'auteur, cela couple étroitement votre code au singleton.

Si vous trouvez que vous souhaitez utiliser un singleton, vous pouvez envisager votre conception, mais il est parfois utile.

Par exemple, une fois, j'ai dû écrire une application pouvant avoir au plus une connexion à une base de données pour traiter des milliers de demandes. Ainsi, un singleton a du sens puisque mes ressources sont limitées à une seule instance.

Mais, généralement, cela est utilisé pour simplifier le code, sans penser aux difficultés qui seront introduites.

Par exemple, et cela s’applique également aux classes statiques, si vous testez l’unité ou si vous avez plusieurs accès simultanés, l’état d’une demande changera cet état, ce qui peut poser problème, car la classe appelant l’instance peut supposer que l’état est tel qu’il est. attendu.

Je pense que la meilleure façon de contester l'utilisation est de penser à la façon de le gérer si votre programme est multi-thread, et un moyen simple de le faire est de le tester à l'unité, si vous avez plusieurs tests exécutés en même temps.

Si vous constatez que vous en avez toujours besoin, utilisez-le, mais réalisez les problèmes qui se poseront ultérieurement.

63
James Black

Je ne considérerais pas exactement que singleton est un anti-modèle.

Cependant, singleton est fondamentalement un moyen d'utiliser des variables globales. Et les variables globales sont mauvaises car n'importe quel code du système peut changer leurs valeurs. Ainsi, lors du débogage, il peut être difficile de déterminer quel chemin de code mène à l'état actuel du singleton.

19
Jack Edmonds

Je pense que cela est considéré comme un anti-motif, car une classe Singleton ne peut pas être instanciée de manière normale par un autre objet (sauf en appelant une telle méthode appelée "getInstance"). Ainsi, il semblera que la classe est utilisée directement sans l'instancier pour créer un objet utilisable au préalable.

Je conviens avec vous que Singleton peut servir d'instance unique globale. J'ai appris de certaines personnes que, comme solutions de rechange pour Singleton, nous pouvons utiliser des variables statiques et/ou finales, ainsi que l'énumération (afin de pouvoir regrouper plusieurs variables sous le même nom de groupe, comme nous le faisons habituellement lorsque nous travaillons avec classe normale/objet).

Cependant, ces alternatives ne peuvent correspondre à la capacité d'une classe Singleton que de stocker des états/valeurs. Si nous avons besoin de fonctions uniques pour travailler, ces variables et énumérations statiques/finales ne peuvent pas vous aider. À mon avis, c'est le cas lorsque nous devons utiliser une classe Singleton (lorsque nous avons besoin de fonctions uniques pour travailler avec des états/valeurs statiques/finaux).

À votre santé... :))

10
peter.aryanto

Les singletons sont souvent mal implémentés. Voir double vérification-verrouillage.

Dans quelle portée une instance Singleton doit-elle être unique? Comme les environnements multi-threadés, le clustering, etc.

Les singletons peuvent être difficiles à tester.

La mémoire allouée à un Singleton ne peut pas être libérée.

Avec une utilisation excessive de singletons, vous quittez la programmation orientée objet pour la programmation procédurale.

6
daniel