Question Différence entre la classe statique et le modèle singleton?


Quelle différence réelle (c'est-à-dire pratique) existe entre une classe statique et un motif singleton?

Les deux peuvent être invoqués sans instanciation, tous deux ne fournissent qu'une seule "Instance" et aucun d'eux n'est thread-safe. Y a-t-il une autre différence?


1489
2018-02-06 08:13


origine


Réponses:


Qu'est-ce qui vous fait dire que soit un singleton ou une méthode statique n'est pas thread-safe? Généralement les deux devrait être mis en œuvre pour être thread-safe.

La grande différence entre un singleton et un tas de méthodes statiques est que les singletons peuvent implémenter des interfaces (ou dériver de classes de base utiles, bien que ce soit moins courant), de sorte que vous pouvez faire le tour du singleton comme si " la mise en oeuvre.


1042
2018-02-06 08:17



La vraie réponse est de Jon Skeet, sur un autre forum ici.

Un singleton permet l'accès à un seul   instance créée - cette instance (ou   plutôt, une référence à cette instance)   peut être transmis en tant que paramètre à d'autres   méthodes, et traitées comme une normale   objet.

Une classe statique permet seulement statique   méthodes


403
2018-02-06 08:21



  1. Les objets Singleton sont stockés dans Tas, mais les objets statiques sont stockés dans empiler.
  2. nous pouvons cloner (si le concepteur ne l'a pas interdit) l'objet singleton, mais nous ne pouvons pas cloner l'objet de classe statique .
  3. Les classes Singleton suivent la OOP (principes orientés objet), les classes statiques ne le font pas.
  4. Nous pouvons mettre en œuvre un interface avec une classe Singleton, mais les méthodes statiques d'une classe (ou par exemple un C # static class) ne peux pas.

324
2017-09-11 10:22



Le modèle Singleton a plusieurs avantages par rapport aux classes statiques. Premièrement, un singleton peut étendre des classes et implémenter des interfaces, alors qu'une classe statique ne peut pas (il peut étendre des classes, mais il n'hérite pas de ses membres d'instance). Un singleton peut être initialisé paresseusement ou de manière asynchrone, tandis qu'une classe statique est généralement initialisée lors du premier chargement, ce qui entraîne des problèmes de chargeur de classe potentiels. Cependant, l'avantage le plus important est que les singletons peuvent être traités de manière polymorphique sans forcer leurs utilisateurs à supposer qu'il n'y a qu'une seule instance.


122
2018-02-06 08:30



static les classes ne doivent rien faire d'état, il est utile de regrouper des fonctions i.e Math (ou Utils dans les projets). Donc, le nom de la classe nous donne juste une idée où nous pouvons trouver les fonctions et il n'y a rien de plus.

Singleton est mon modèle préféré et l'utilise pour gérer quelque chose à un seul point. C'est plus flexible que static classes et peut maintenir l'état. Il peut implémenter des interfaces, hériter d'autres classes et autoriser l'héritage.

Ma règle pour choisir entre static et singleton:

S'il y a un tas de fonctions à garder ensemble, alors static est le choix. Tout ce qui nécessite un accès unique à certaines ressources pourrait être mis en œuvre singleton.


56
2017-12-30 20:55



Classe statique: -

  1. Vous ne pouvez pas créer l'instance de la classe statique.

  2. Chargé automatiquement par le Common Language Runtime (CLR) .NET Framework lorsque le programme ou l'espace de noms contenant la classe est chargé.

  3. La classe statique ne peut pas avoir de constructeur.

  4. Nous ne pouvons pas passer la classe statique à la méthode.

  5. Nous ne pouvons pas hériter de la classe statique à une autre classe statique en C #.

  6. Une classe ayant toutes les méthodes statiques.

  7. Meilleure performance (les méthodes statiques sont collées au moment de la compilation)

Singleton:-

  1. Vous pouvez créer une instance de l'objet et le réutiliser.

  2. L'instance Singleton est créée pour la première fois lorsque l'utilisateur l'a demandé.

  3. La classe Singleton peut avoir un constructeur.

  4. Vous pouvez créer l'objet de la classe singleton et le passer à la méthode.

  5. La classe Singleton ne dit aucune restriction d'héritage.

  6. Nous pouvons disposer les objets d'une classe singleton mais pas de classe statique.

  7. Les méthodes peuvent être surchargées.

  8. Peut être paresseux chargé en cas de besoin (les classes statiques sont toujours chargées).

  9. Nous pouvons implémenter l'interface (la classe statique ne peut pas implémenter l'interface).


49
2018-06-01 11:42



Une classe statique est celle qui n'a que des méthodes statiques, pour lesquelles un meilleur mot serait "fonctions". Le style de conception incorporé dans une classe statique est purement procédural.

Singleton, d'autre part, est un modèle spécifique à la conception OO. C'est une instance d'un objet (avec toutes les possibilités inhérentes à cela, comme le polymorphisme), avec une procédure de création qui garantit qu'il n'y a jamais qu'une instance de ce rôle particulier pendant toute sa durée de vie.


47
2018-02-06 08:35



Dans le modèle singleton, vous pouvez créer le singleton comme une instance d'un type dérivé, vous ne pouvez pas le faire avec une classe statique.

Exemple rapide:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

32
2018-02-06 08:16



Pour développer La réponse de Jon Skeet

La grande différence entre un singleton et un tas de méthodes statiques est que singletons peuvent implémenter des interfaces (ou dériver de classes de base utiles, bien que ce soit moins commun IME), donc vous pouvez passer le singleton comme s'il s'agissait d'une implémentation "juste une autre".

Les singletons sont plus faciles à utiliser lors des tests unitaires d'une classe. Où que vous passiez des singletons en tant que paramètre (constructeurs, setters ou méthodes), vous pouvez remplacer une version simulée ou tronquée du singleton.


22
2017-12-20 21:53



Un autre avantage d'un singleton est qu'il peut facilement être sérialisé, ce qui peut être nécessaire si vous devez sauvegarder son état sur un disque, ou l'envoyer à distance.


20
2017-08-08 03:36



Je ne suis pas un grand théoricien de l'OO, mais d'après ce que je sais, je pense que la seule caractéristique OO qui manque aux classes statiques par rapport aux Singletons est le polymorphisme. Mais si vous n'en avez pas besoin, avec une classe statique, vous pouvez bien sûr avoir de l'héritage (pas sûr de l'implémentation de l'interface) et de l'encapsulation des données et des fonctions.

Le commentaire de Morendil, "Le style de conception incarné dans une classe statique est purement procédurale" Je peux me tromper, mais je ne suis pas d'accord. Dans les méthodes statiques, vous pouvez accéder aux membres statiques, ce qui serait exactement la même chose que les méthodes singleton accédant à leurs membres d'instance unique.

modifier:
Je pense en fait maintenant qu'une autre différence est qu'une classe statique est instancié au début du programme * et vit pendant toute la durée de vie du programme, tandis qu'un singleton est explicitement instancié à un certain moment et peut être détruit aussi.

* ou il peut être instancié à la première utilisation, selon la langue, je pense.


17
2017-08-16 15:54