112 votes

Quelle Alternative à Singleton

Nous avons une classe qui contient les informations de configuration de l'application. Il sert à être un singleton. Après quelques architectural review, on nous a dit de supprimer le singleton. Nous avons vu certains avantages à ne pas utiliser singleton dans l'unité de test parce que nous pouvons tester différentes configurations tout à la fois.

Sans singleton, nous devons passer par l'instance partout dans notre code. Il se fait tellement bordélique donc, nous avons écrit un singleton wrapper. Maintenant, nous sommes de porter le même code PHP et .NET, je me demande s'il est un meilleur modèle que nous pouvons utiliser pour la configuration de l'objet.

128voto

FrankS Points 1553

Le Google blog Test a une série d'entrées d'éviter de Singleton (afin de créer de code de tests). Peut-être cela peut vous aider:

Le dernier article explique en détail comment se déplacer à la création de nouveaux objets dans une usine, de sorte que vous pouvez éviter d'utiliser des singletons. La peine de lire pour vous.

En bref, nous déplacer tous les nouveaux opérateurs de l'usine. Nous regroupons tous les objets de semblable à vie dans une seule usine.

15voto

gbjbaanb Points 31045

Le meilleur moyen est d'utiliser un modèle de Fabrique à la place. Lorsque vous créez une nouvelle instance de votre classe (en usine), vous pouvez insérer le "global" des données dans le nouvellement construit de l'objet, soit comme une référence à une instance unique (qui vous stockez dans la classe usine) ou en copiant les données pertinentes dans le nouvel objet.

Tous vos objets vont alors contenir les données que l'habitude de vivre dans le singleton. Je ne pense pas qu'il y a beaucoup de différence dans l'ensemble, mais il peut rendre votre code plus facile à lire.

5voto

Phill Sacre Points 16238

J'ai peut-être une lapalissade ici, mais est-il une raison pour laquelle vous ne pouvez pas utiliser une injection de dépendance framework comme Spring ou Guice? (Je crois que le Printemps est également disponible pour .NET ainsi maintenant).

De cette façon, le cadre peut contenir une et une seule copie de la configuration des objets, et les haricots (services, DAOs, peu importe) n'avez pas à vous soucier de la recherche.

C'est l'approche que j'ai l'habitude de prendre!

4voto

CoverosGene Points 3294

Si vous utilisez le Framework Spring, vous pouvez simplement créer une fève. Par défaut (ou si vous définissez explicitement scope="singleton") une seule instance du bean est créé et que l'instance est renvoyée chaque fois que le bean est utilisé dans une dépendance ou récupérées au moyen d' getBean().

Vous obtenez l'avantage de l'instance unique, sans le couplage de le pattern Singleton.

4voto

dfa Points 54490

n'accumule pas de responsabilités à un objet de configuration unique puisqu'il se termine par un très gros objet qui est à la fois difficile à comprendre et fragile.

Par exemple, si vous avez besoin d'un autre paramètre à une classe particulière, vous modifiez l' Configuration objet, puis de recompiler toutes les classes qui l'utilise. C'est un peu problématique.

Essayez la refactorisation de votre code afin d'éviter une commune, globale et les grandes Configuration objet. Passer seulement les paramètres requis par les classes clientes:

class Server {

    int port;

    Server(Configuration config) {
        this.port = config.getServerPort();
    } 

}

doit être refait:

 class Server {

    public Server(int port) {
       this.port = port;
    }
 }

une injection de dépendance cadre aidera beaucoup ici, mais il n'est pas strictement nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X