2016-02-17 1 views
0

Nous avons un système qui a beaucoup d'objets de modèle (par exemple Car, Pedestrian, Road, ...)Singleton Vs Singleton usine

Actuellement, tous les gestionnaires ont (CarManager, PedestrianManager, RoadManager) qui retournent une singleton de la classe respective.

Une alternative proposée est d'avoir un singleton ManagerFactory qui peut renvoyer les instances de CarManager, PedestrianManager, RoadManager. (Par exemple ManagerFactory.getInstance().getCarManager())

Nous écrivons également un test pour le projet et le souci était que si nous utiliserons l'injection de dépendances, nous aurons besoin d'une instance réelle d'un objet pour injecter des gestionnaires.

Cette alternative est-elle bonne? Souhaitez-vous changer le singleton en quelque chose d'autre dans ce cas?

+0

Ceci est l'opinion, mais j'opterais pour l'option qui vous donne le moins de couplage/interdépendances entre les différentes parties de votre code. Et aussi tout ce qui vous oblige à diffuser des connaissances sur la façon dont votre code fonctionne à travers votre code, si cela a du sens. – nielsbot

+0

Mon instinct est cependant de ne pas avoir 'ManagerFactory' - je pense que c'est moins compliqué. – nielsbot

Répondre

0

Un singleton directement ou une fabrique singleton sont fondamentalement la même chose - une référence opaque à quelque chose - une dépendance cachée. Avec une recherche de texte globale, vous pouvez trouver ces dépendances, de sorte qu'aucune option ne rend la situation meilleure ou pire.

L'injection de dépendance signifie que vous déclarez publiquement que, pour que A fonctionne, il a besoin d'une instance de B (ou une instance conforme au protocole C est une meilleure situation de dépendance). D'un point de vue test, l'injection de dépendance est de loin supérieure, car vous voulez généralement créer une version fictive de B et l'utiliser pour tester A. Le test injecte l'instance à utiliser. Tester des singletons est une ...

Donc, idéalement, la première classe impliquée créerait une instance de B et la passerait aux autres classes qui en ont besoin, et cette instance serait transmise à partir de là.

+0

Donc, dans l'ensemble, ce que vous dites est que les deux approches sont la même chose, mais la seconde est meilleure car elle permet l'injection de dépendance? – Ravul

+0

Les singletons n'empêchent pas l'injection de dépendance en tant que telle, mais si vous utilisez l'injection de dépendance, vous n'utilisez généralement pas de singleton. Pour l'usine, utilisez-la si elle ajoute de la valeur, si elle appelle littéralement alloc + init, elle n'ajoute aucune valeur, si elle a une logique de générateur, elle peut ajouter de la valeur. – Wain