Je n'ai jamais trouvé de bonnes réponses à ces questions simples sur les classes d'assistance / utilitaire:
Pourquoi créerais-je un singleton (sans état) au lieu d'utiliser des méthodes statiques?
Pourquoi une instance d'objet serait-elle nécessaire si un objet n'a pas d'état?
java
design-patterns
singleton
Sébastien Lorber
la source
la source
Réponses:
Souvent, les singletons sont utilisés pour introduire une sorte d' état global dans une application. (Plus souvent que vraiment nécessaire, pour être honnête, mais c'est un sujet pour une autre fois.)
Cependant, il existe quelques cas secondaires où même un singleton sans état peut être utile:
Exemple: objets de synchronisation pour le C #
lock
ou l'synchronized
instruction Java .Exemple: La
Toolkit.getDefaultToolkit()
méthode en Java retournera un singleton dont le type exact dépend du système.Exemple:
DBNull.Value
en C #.la source
Je pourrais voir un cas pour un singleton sans état utilisé au lieu d'une classe de méthodes statiques, à savoir pour l' injection de dépendances .
Si vous avez une classe d'assistance de fonctions utilitaires que vous utilisez directement, cela crée une dépendance cachée; vous n'avez aucun contrôle sur qui peut l'utiliser, ni où. L'injection de cette même classe d'assistance via une instance de singleton sans état vous permet de contrôler où et comment elle est utilisée, et de la remplacer / la simuler / etc. lorsque vous en avez besoin.
En faire une instance singleton garantit simplement que vous n'allouez pas plus d'objets du type que nécessaire (puisque vous n'en avez besoin que d'un seul).
la source
En fait, j'ai trouvé une autre réponse non mentionnée ici: les méthodes statiques sont plus difficiles à tester.
Il semble que la plupart des frameworks de test fonctionnent très bien pour les méthodes d'instance simulées, mais beaucoup d'entre eux ne gèrent pas de manière décente la simulation des méthodes statiques.
la source
Dans la plupart des langages de programmation, les classes échappent à une grande partie du système de types. Alors qu'une classe, avec ses méthodes et variables statiques est un objet, elle ne peut très souvent pas implémenter une interface ou étendre d'autres classes. Pour cette raison, il ne peut pas être utilisé de manière polymorphe, car il ne peut pas être le sous-type d'un autre type. Par exemple, si vous avez une interface
IFooable
, qui est requise par plusieurs signatures de méthode d'autres classes, l'objet de classe neStaticFoo
peut pas être utilisé à la place deIFooable
, alors queFooSingleton.getInstance()
can (en supposant,FooSingleton
implémenteIFooable
).Veuillez noter que, comme je l'ai commenté sur la réponse de Heinzi, un singleton est un modèle pour contrôler l'instanciation. Il remplace
new Class()
parClass.getInstance()
, ce qui donne à l'auteurClass
plus de contrôle sur les instances, qu'il peut utiliser pour empêcher la création d'instances inutiles. Le singleton est juste un cas très particulier du motif de fabrique et doit être traité comme tel. L'utilisation courante en fait plutôt le cas particulier des registres globaux, qui finissent souvent par être mauvais, car les registres globaux ne doivent pas être utilisés bon gré mal gré.Si vous prévoyez de fournir des fonctions d'assistance globales, les méthodes statiques fonctionneront parfaitement. La classe n'agira pas en tant que classe, mais simplement en tant qu'espace de noms. Je suggère que vous préserviez une cohésion élevée, ou vous pourriez vous retrouver avec les problèmes de couplage les plus étranges.
Greetz
back2dos
la source
Il y a un compromis entre utiliser lequel. Les singletons peuvent avoir ou non un état et ils se réfèrent à des objets. S'ils ne conservent pas l'état et ne sont utilisés que pour un accès global, alors la statique est préférable car ces méthodes seront plus rapides. Mais si vous souhaitez utiliser des objets et des concepts POO (polymorphisme d'héritage), alors le singleton est meilleur.
Prenons un exemple: java.lang.Runtime est une classe singleton en java. Cette classe autorise différentes implémentations pour chaque JVM. L'implémentation est unique par JVM. Si cette classe aurait été statique, nous ne pouvons pas transmettre différentes implémentations basées sur JVM.
J'ai trouvé ce lien vraiment utile: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
J'espère que ça aide!!
la source
Pour moi "Want Object State use Singleton, Want Function use static method"
Cela dépend de ce que vous voulez. Chaque fois que vous voulez l'état de l'objet (par exemple, Polymorphisme comme l'état Null au lieu de
null
, ou l'état par défaut), singleton est le choix approprié pour vous tandis que la méthode statique est utilisée lorsque vous avez besoin d'une fonction (recevoir des entrées puis renvoyer une sortie).Je recommande pour le cas singleton, il devrait toujours avoir le même état après son instanciation. Il ne doit ni être clonable, ni recevoir de valeur à définir (sauf la configuration statique du fichier, par exemple le fichier de propriétés en java).
PS Les performances entre ces 2 sont différentes en millisecondes, alors concentrez-vous d'abord sur l' architecture .
la source
Singleton n'est pas apatride, il détient l'état global.
Certaines raisons pour lesquelles je peux penser à utiliser Singleton sont:
la source