Quand la Communauté pense-t-elle qu'il est approprié d'utiliser un Singleton? [dupliquer]

StackOverflow https://stackoverflow.com/questions/138124

  •  02-07-2019
  •  | 
  •  

Question

  

Double possible:
   Singleton: comment l'utiliser?

Pour faire suite à l’excellente question posée précédemment par Ewan Makepeace à propos du modèle de Singleton, je pensais pouvoir poser la question suivante: "Quand la Communauté estime-t-elle qu’il est approprié d’utiliser un Singleton?"

Laissez-moi vous donner un exemple à critiquer:

J'ai un " IconManager " singleton. Il commence par lire un fichier de propriétés indiquant l'emplacement de mes icônes sur le disque, puis lit toutes les icônes et les met en cache pour une utilisation ultérieure.

Les icônes peuvent être utilisées sur l’ensemble de mon interface utilisateur (onglets, tableaux, cadres, etc.). Il est donc très utile de pouvoir y accéder via une méthode singleton statique. Je veux aussi m'assurer que les icônes sont lues une fois et une seule fois (s'il serait très lent de les lire à partir du disque chaque fois que j'en ai besoin) La communauté pense-t-elle qu'il s'agit d'une utilisation appropriée d'un Singleton? Sinon, comment aurait-il pu être mis en œuvre autrement?

Quelles autres utilisations valables des singletons pourraient-il exister?

Était-ce utile?

La solution

Votre IconManager implémente le modèle d'usine, il construit des icônes. Et vous n’avez probablement besoin que d’une usine pour créer des icônes. Donc, pas de problèmes pour ce cas d'utiliser un singleton IMHO. J'ai construit des logiciels avec plusieurs de ces usines centralisées et tout s'est bien passé.

Voir aussi ce fil: exemples les plus courants d'abus de singleton class

Autres conseils

Une autre approche consisterait à créer une instance de votre classe qui charge les icônes, puis à transmettre une référence à cette instance à tous les contrôles devant accéder aux ressources. Ainsi, à l'avenir, vous pourriez avoir plus d'un chargeur d'icônes et les faire passer au besoin. Plus flexible pour l’avenir mais avec l’inconvénient plutôt important de vous faire passer la référence à un zillion de contrôles.

Le singleton est un bon moyen d’accéder à une ressource qui ne peut avoir qu’une connexion active. De nombreux périphériques matériels sont soumis à cette limitation.

Supposons que vous vous connectiez à une caméra de vidéosurveillance qui n'autorise qu'une seule connexion. Le modèle Singleton créerait cette connexion lors de la première utilisation et le maintiendrait ouvert. Chaque fois que vous avez besoin d'une photo de l'appareil photo, éventuellement de plusieurs sources, vous pouvez appuyer sur le Singleton en sachant que, pour tous les autres problèmes examinés, la photo sera disponible.

Si la caméra a également un temps de connexion initial trop lent, maintenir la connexion ouverte de cette façon plutôt que de l'ouvrir, capturer une photo et refermer la connexion pourrait s'avérer beaucoup plus efficace.

En fait, je n'ai jamais utilisé de singleton, mais je n'ai pas beaucoup utilisé les modèles de conception. Je pense qu’ils sont très utiles lorsque d’autres modèles les appellent, comme les modèles Factory et Gateway. Cependant, ils ne sont presque jamais bons tous seuls.

Vous voudrez peut-être prendre en compte le modèle de monostat qui vous donne tous les avantages du singleton sans beaucoup d’inconvénients. Ceci vous permet également d’avoir un objet riche dont l’état possède les propriétés globales que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top