J'ai lu sur de nombreux endroits que les singletons peuvent utiliser des interfaces. Certains comment je suis incapable de comprendre cela. P>
5 Réponses :
Chaque classe peut implémenter une interface et un singleton est juste une classe "normale" qui veille à ce que l'une seule instance existe à un moment quelconque de l'autre logique commerciale qu'elle peut implémenter. Cela signifie également qu'un singleton a au moins 2 responsabilités et ce n'est pas une bonne conception OO, car les classes ne doivent avoir que 1 responsabilité et s'assurer qu'ils sont bons à cette responsabilité, mais c'est une autre discussion. P>
Pourquoi un singleton n'est pas bon oo design? En fait, c'est l'un des modèles de conception les plus courants de OO
@Christianvielma: (Oui, tard) Le problème est-il créé Global State i>, comme Variables globales i> et souffre de problèmes similaires. Par exemple, il est difficile de tester des cours qui demandent à l'intérieur des singletons sans connaissances extérieures. Votre DB de production est pleine de déchets / de données de test? Vérifiez les singletons. Chasser un bug? Si vous avez des singletons, et donc l'état mondial, vous ne pouvez pas simplement vous concentrer sur une portée limitée; Vous devez garder la base de code à l'esprit. Merci un singleton. Notez que cela concerne le singleton motif i>, pas singleton objets i>. L'utilisation commune ne signifie pas que cela doit être «bon».
Un singleton a une instance - il n'a jamais plus d'une instance. Vous utilisez probablement quelques membres statiques pour une extraction de référence et pour vous assurer qu'il ne reçoit jamais de multiples instances, mais pour la plupart, la classe est la même que toute autre classe. P>
Quelque chose comme: et p>
FYI, la meilleure façon de mettre en œuvre un singleton consiste à utiliser un seul élément enum. Il est plus concis que l'approche publique sur le terrain et fournit gratuitement le mécanisme de sérialisation et offre également une sécurité contre les attaques de réflexion. Cette méthode n'a pas encore été largement adoptée, mais elle pourrait être intéressante de savoir. Pour plus d'informations, voir l'élément à ce sujet dans «Java efficace» de Joshua Bloch.
@Andrew: Merci, je rebondissais entre le travail et le jour de la journée et je l'ai manqué par accident :-)
@ NKR1PT: J'essaie généralement d'éviter les singletons, mais que vous utilisez une énumération, c'est une idée soignée, merci pour le pointeur.
@ nkr1pt je n'avais jamais pensé à cette technique. C'est vraiment puissant, mais choquant simple. Il simplifie également de manière massive le référencement et le rend très intuitif
Fondamentalement, une classe Singleton est une classe qui peut être instanciée une seule une fois. Le modèle de classe Singleton est mis en œuvre à l'aide d'une méthode statique pour obtenir l'instance de la classe Singleton et en restreignant l'accès à son (s) constructeur (s). P>
Comme avec l'utilisation d'une interface, il serait similaire à la manière dont toute autre classe implémentait une interface. P>
Et aussi, cela ne devrait pas autoriser le clonage de cet objet. p>
Je pense que j'ai compris votre problème. Vous souhaitez définir la méthode d'usine dans l'interface (méthode statique à GetInstance ()). Mais comme la méthode d'usine ne peut pas être définie dans l'interface, cette logique ne fonctionnera pas. P>
Une option est d'avoir une classe d'usine qui détient cette méthode statique. Donc, il y aura trois classes première classe pour tenir la méthode statique Deuxièmement, l'interface troisième est la classe concrète p>
Mais nous ne pouvons pas faire du constructeur concret privé. P>
Mais si votre infrastructure a deux paquets un pour le public et l'autre pour privé p>
Définir l'interface en public, rendre le niveau de package de classe concret (sans aucun modificateur d'accès) et la classe d'usine et la méthode statique sont publiques. P>
J'espère que cela pourrait vous aider. P>