Existe-il des solutions de rechange viables pour le GOF Pattern Singleton?
Avouons-le. Le Pattern Singleton est très controversée sujet avec des hordes de programmeurs sur les deux côtés de la barrière. Il y a ceux qui se sentent comme le Singleton n'est rien de plus alors une simple variable globale, et d'autres qui ne jurent que par le modèle et l'utiliser sans cesse. Je ne veux pas le Singleton Controverse être au cœur de ma question, cependant. Tout le monde peut avoir un remorqueur de la guerre et de la bataille de sortir et de voir qui gagne pour tous les soins, je. Ce que j'essaie de dire, c'est que je ne crois pas qu'il existe une seule bonne réponse et je ne suis pas intentionnellement essayer attiser les querelles partisanes. Je suis simplement intéressé par singleton-alternatives quand j'ai poser la question:
Sont leurs alternatives spécifiques à l'GOF Pattern Singleton?
Par exemple, les nombreuses fois où j'ai utilisé le pattern singleton dans le passé, je suis tout simplement intéressés par la préservation de l'état sur les valeurs d'une ou de plusieurs variables. L'état/de valeurs de variables, cependant, peut être conservé entre chaque instanciation de la classe à l'aide de variables statiques au lieu d'utiliser le pattern singleton.
Ce que d'autres idées avez-vous?
EDIT: je ne veux pas vraiment que cela soit un autre post sur "comment utiliser le singleton correctement." Encore une fois, je suis à la recherche de moyens pour l'éviter. Pour le fun, ok? Je crois que je vais demander à un point de vue purement académique question dans votre meilleur bande annonce du film la voix, "Dans un univers parallèle où il n'y a pas de singleton, que pourrions-nous faire?"
- Quoi? Ce n'est ni bon, ni mauvais, mais comment puis-je le remplacer? Pour tous les gens qui disent que c'est bon-ne pas participer. Tous les gens qui disent que c'est mauvais, la preuve en me montrant comment je peux vivre sans elle. Sons Argumentatif pour moi.
- a lire l'ensemble du post. Voilà comment j'ai eu le sentiment de "ne pas répondre si vous chose les Singletons sont ok".
- Eh bien, si c'est comment il est venu à travers, je m'en excuse. J'ai pensé que j'ai pris d'importantes mesures pour éviter la polarisation. J'ai pensé que j'ai posé la question dans une manière que les deux amants et ennemis des gens de Singletons pourraient venir de loin avec que en tant que programmeur nous avons tous des choix -- qui leur est jamais qu'une seule bonne manière
- Si j'utilise des Singletons, je n'ai aucune contribution possible de la manière de travailler autour d'eux. Sons polarisant pour moi.
- J'utilise les Singletons de tous les jours mais qui ne m'empêche pas de penser qu'il pourrait être une meilleure façon de faire les choses? Les Modèles de conception ont seulement été autour pendant 14 ans. Dois-je prendre comme vérité biblique? Nous devons nous arrêter en essayant de penser à l'extérieur de la boîte? N'avons-nous pas essayer de faire avancer la discipline de la CS?
- Tout à fait vrai. Je suis d'accord avec la recherche d'une meilleure façon. Je ne comprends juste pas le 1er paragraphe de la question. Il demande qu'une chose: ne PAS utiliser les Singletons; je trouve le reste de la substance sur la Controverse à confusion et hors-tâche.
- OK. La Re-lecture il y a quelques temps, maintenant je peux voir d'où vous venez. Je vais certainement essayer de ré-parole quelques choses ce soir. Et je vais être honnête, la controverse stuff est un peu hors-tâche, et j'ai vu comme une attention grabber.
Vous devez vous connecter pour publier un commentaire.
Alex Miller dans "Les Modèles Que Je Déteste" citations suivantes:
"Quand un singleton semble que la réponse, je trouve qu'il est souvent plus sage de:
De comprendre la bonne façon de contourner les Singletons, vous avez besoin de comprendre quel est le problème avec les Singletons (et de l'état global en général):
Singletons cacher dépendances.
Pourquoi est-ce important?
Parce que Si vous masquez les dépendances vous avez tendance à perdre la trace de la quantité de couplage.
Vous diront que
est plus simple que
mais au moins la deuxième API fait clair exactement ce que la méthode de collaborateurs.
Ainsi la voie à la solution de contournement des Singletons est de ne pas utiliser les variables statiques ou service-localisateurs, mais pour changer le Singleton-classes dans les instances, qui sont instanciés dans le champ où ils font sens et injecté dans les composants et les méthodes qui en ont besoin. Vous pouvez utiliser un Cio-cadre pour gérer cela, ou vous pouvez le faire manuellement, mais la chose importante est de se débarrasser de votre état global et de faire les dépendances et les collaborations explicite.
La meilleur solution je suis venu à travers est l'aide de l'usine modèle pour construire des instances de classes. À l'aide du modèle, vous pouvez assurer qu'il existe une seule instance d'une classe qui est partagé entre les objets qui l'utilisent.
Je pensais que ce serait compliqué à gérer, mais après la lecture de ce billet de blog "Où sont Tous les Singletons Parti?", il semble si naturel. Et en aparté, il aide beaucoup à isoler vos tests unitaires.
En résumé, ce que vous devez faire? Chaque fois qu'un objet dépend d'un autre, il recevra une instance de que par son constructeur (pas de nouveau mot-clé dans votre classe).
Et puis, l'usine.
Que vous instanciez votre usine qu'une seule fois, il y aura une seule instanciation de exSingleton. Chaque fois que vous appelez buildNeedy, la nouvelle instance de NeedyClass sera livré avec exSingleton.
J'espère que cette aide. S'il vous plaît signaler toute erreur.
Printemps ou tout autre Cio-Conteneur fait un assez bon travail dans ce. Puisque les classes sont créés et gérés en dehors de l'application elle-même, le conteneur peut faire de simples classes singletons et de les injecter en cas de besoin.
Vous ne devriez pas avoir à sortir de votre chemin pour éviter toute répétition. L'utilisation d'un modèle est une décision de conception ou un ajustement naturel (il tombe juste dans la place). Lors de la conception d'un système, vous avez le choix soit d'utiliser un modèle ou utilisez pas le modèle. Cependant, vous ne devriez pas sortir de votre chemin pour éviter tout ce qui est en fin de compte un choix de conception.
Je ne suis pas d'éviter le Pattern Singleton. Soit c'est approprié et je l'utiliser ou il n'est pas approprié et je ne l'utilise pas. Je crois que c'est aussi simple que cela.
De la pertinence (ou l'absence) de l'Singleton dépend de la situation. C'est une décision qui doit être fait et les conséquences de cette décision doit être compris (et documentées).
La singleton modèle existe parce qu'il y a des situations où un unique objet est nécessaire pour fournir un ensemble de services.
Même si c'est le cas, j'ai toujours tenir compte de l'approche de la création de singletons à l'aide d'un mondiale champ statique/propriété représentant de l'instance, inapproprié. C'est inappropriée parce qu'elle crée une dépendance dans le code entre le champ statique et que l'objet n', les services de l'objet fournit.
Donc au lieu de la classique, le pattern singleton, je vous recommande d'utiliser le service 'comme' modèle avec serviced conteneurs, où au lieu d'utiliser votre singleton par l'intermédiaire d'un champ statique, vous obtenez une référence à travers une méthode demandant le type de service requis.
au lieu d'une seule mondial
De cette façon, lorsque vous souhaitez changer le type d'un objet à partir de singleton à autre chose, vous aurez et facile temps de le faire. Aussi un et l'avantage supplémentaire de ne pas avoir à passer autour d'attribuer des instances d'objet pour chaque méthode.
Voir aussi L'Inversion de Contrôle, l'idée est que, en exposant les singletons directement au consommateur, à vous de créer une dépendance entre le consommateur et l'objet de l'instance, non pas à l'objet des services fournis par l'objet.
Mon avis est de cacher l'utilisation du pattern singleton chaque fois que possible, car il n'est pas toujours possible de l'éviter, ou souhaitable.
Monostate (décrit dans Robert C. Martin Agile de Développement Logiciel) est une alternative à un singleton). Dans ce modèle de la classe de données sont tous statiques, mais les getters/setters sont non-statique.
Par exemple:
Monostate a un comportement similaire à singleton, mais le fait dans un mode où le programmeur n'est pas nécessairement conscient du fait qu'un singleton est utilisé.
Si vous utilisez un Singleton pour représenter un objet de données, vous pouvez passer d'un objet de données comme un paramètre de méthode.
(bien que, je dirais que c'est la mauvaise façon d'utiliser un Singleton en premier lieu)
Si votre problème est que vous souhaitez conserver en l'état, vous voulez un MumbleManager classe. Avant de commencer à travailler avec un système, votre client crée un MumbleManager, où Mumble est le nom du système. L'état est conservé à travers cela. Les Chances sont de votre MumbleManager contiendra un sac de propriété qui détient votre état.
Ce type de style se sent très à C-like et pas très à l'objet comme vous le constaterez que les objets qui définissent votre système aura une référence à la même MumbleManager.
Utilisez un simple objet et un objet de fabrique. L'usine est responsable de la surveillance de l'instance et de la plaine de détails de l'objet uniquement avec les informations de configuration (il contient par exemple) et le comportement.
En fait, si vous le design à partir de zéro pour éviter de Singeltons, vous pourriez ne pas avoir à contourner utilisez pas des Singletons en utilisant les variables statiques. Lors de l'utilisation de variables statiques, vous êtes également la création d'un Singleton, plus ou moins, la seule différence est que vous êtes la création de différentes instances de l'objet, cependant en interne, ils se comportent tous comme s'ils étaient à l'aide d'un Singleton.
Vous pouvez peut-être donner un exemple détaillé où vous utilisez un Singleton ou lorsqu'un Singleton est actuellement utilisé et que vous essayez d'éviter de l'utiliser? Cela pourrait aider les personnes à trouver un plus de fantaisie solution comment la situation pourrait être manipulé sans un Singleton à tous.
BTW, personnellement, je n'ai pas de problèmes avec les Singletons et je ne peux pas comprendre les problèmes des autres concernant les Singletons. Je ne vois rien de mauvais à propos d'eux. C'est, si vous n'êtes pas en abuser. Chaque technique utile peut être abusé et si maltraitée, elle conduira à des résultats négatifs. Une autre technique qui est souvent utilisé à mauvais escient est l'héritage. Toujours personne n'oserait dire l'héritage est quelque chose de mauvais juste parce que certaines personnes horriblement en abuser.
Personnellement, pour moi, а beaucoup plus sage façon de mettre en œuvre quelque chose qui se comporte comme un singleton est complètement statique de la classe(statique membres , des méthodes statiques , les propriétés statiques).
La plupart du temps, je en œuvre de cette façon (je ne peux pas penser à des différences de comportement du point de vue utilisateur)
Je pense que le meilleur endroit pour la police, le singleton est à la classe niveau design. À ce stade, vous devriez être en mesure de cartographier les interactions entre les classes et de voir si quelque chose d'absolument, certainement que seulement 1 instance de cette classe est toujours en existence, à tout moment, les applications de la vie.
Si c'est le cas, alors vous avez un singleton. Si vous jeter les singletons de commodité lors de codage, alors vous devriez vraiment être revoir votre conception, et aussi arrêter de codage dit singletons 🙂
Et oui, "faire la police" est le mot que je voulais dire ici, plutôt que d '"éviter". Le singleton n'est pas quelque chose à éviter (de la même manière que les goto et les variables globales ne sont pas quelque chose à éviter). Au lieu de cela, vous devriez le suivi de l'utilisation et de s'assurer que c'est la meilleure méthode pour obtenir ce que vous voulez faire efficacement.
- Je utiliser singleton surtout comme des "méthodes" conteneur, sans état à tous. Si j'ai besoin de partager ces méthodes avec de nombreuses classes et pour éviter le fardeau de l'instanciation et l'initialisation je créer un contexte/session et d'initialiser toutes les classes-t-il; tout ce qui se rapporte à la session a également accès à la "singleton", ce qui les contenaient.
N'ayant pas programmé dans une intensément orientée objet de l'environnement (par exemple Java), je ne suis pas complètement sur les subtilités de la discussion. Mais j'ai mis en place un singleton dans PHP 4. J'ai fait ça comme une manière de créer une 'boîte noire' de la base de données gestionnaire de initialisée automatiquement et vous n'avez pas à être transmis en haut et en bas des appels de fonction dans une incomplète et un peu cassé cadre.
Avoir lu quelques liens de singleton modèles, je ne suis pas complètement sûr que je voudrais mettre en œuvre tout à fait de la même façon. Ce qui est réellement nécessaire a été plusieurs objets de stockage partagé (par exemple, la base de données de la poignée) et c'est à peu près ce que mon appel transformé en.
Comme la plupart des modèles et des algorithmes, à l'aide d'un singleton "juste parce que c'est cool" est La Mauvaise Chose À Faire. J'avais besoin d'un véritable "boîte noire" appel, qui s'est mis à regarder un peu comme un singleton. Et IMO c'est la façon de s'attaquer à la question: être conscients de le modèle, mais aussi regarder de plus large portée et à ce niveau, c'est une instance doit être unique.
Qu'entendez-vous, quelles sont mes techniques pour l'éviter?
À "éviter", ce qui implique qu'il y a de nombreuses situations que je rencontre dans lequel le pattern singleton est naturellement bon ajustement, et donc que je dois prendre certaines mesures pour désamorcer ces situations.
Mais il n'y a pas. Je n'ai pas à éviter le pattern singleton. Il n'a tout simplement pas le jour.