Contexte : J'ai quelques classes qui mettent en œuvre un modèle de conception sujet/observateur que j'ai rendu sûr pour les threads. A subject
notifiera à son observers
par un simple appel de méthode observer->Notified( this )
si le observer
a été construit dans le même fil de discussion que celui de la notification. Mais si le observer
a été construit dans un autre fil de discussion, la notification sera affichée dans un fichier queue
qui sera traité ultérieurement par le thread qui a construit le fichier observer
puis l'appel à la méthode simple peut être effectué lorsque l'événement de notification est traité.
J'ai donc une carte qui associe les threads et les files d'attente et qui est mise à jour lorsque les threads et les files d'attente sont construits et détruits. Cette carte utilise elle-même un mutex pour protéger l'accès multithread à cette carte.
La carte est un singleton.
J'ai été coupable d'utiliser des singletons dans le passé parce qu'il n'y en aurait qu'un seul dans cette application, et croyez-moi, j'ai payé ma pénitence !
Une partie de moi ne peut s'empêcher de penser qu'il n'y aura vraiment qu'une seule carte de file d'attente/thread dans une application. L'autre voix dit que les singletons ne sont pas bons et qu'il faut les éviter.
J'aime l'idée de supprimer le singleton et de pouvoir l'insérer dans mes tests unitaires. Le problème, c'est que j'ai du mal à trouver une bonne solution alternative.
La solution "habituelle" qui a fonctionné dans le passé est de passer un pointeur sur l'objet à utiliser au lieu de référencer le singleton. Je pense que ce serait délicat dans ce cas, puisque les observateurs et les sujets sont à 10 cents dans mon application et qu'il serait très gênant d'avoir à passer un objet file d'attente/thread map dans le constructeur de chaque observateur.
Ce que je comprends, c'est que je peux très bien n'avoir qu'une seule carte dans mon application, mais ce n'est pas dans les entrailles du code du sujet et de la classe d'observateurs que cette décision est prise.
Il s'agit peut-être d'un singleton valide, mais j'apprécierais également toute idée sur la façon dont je pourrais le supprimer.
Merci.
PS. J'ai lu Quelle est l'alternative à Singleton ? y cet article mentionné dans la réponse acceptée. Je ne peux m'empêcher de penser que l'ApplicationFactory n'est qu'un autre singleton sous un autre nom. Je ne vois vraiment pas l'avantage.