C# Singleton avec un constructeur qui accepte des paramètres
Je veux créer une classe statique ou de la classe singleton qui accepte une référence à un autre objet dans son constructeur. Les classes statiques sont sortis, mais j'ai pensé que je pourrais créer un singleton qui accepte des paramètres dans son constructeur. Jusqu'à présent, je n'ai pas eu de chance de trouver ou de googler la syntaxe. Est-ce possible? si oui, comment dois-je faire?
Désolé pour aucun exemple dans le post initial, je l'ai écrit dans un rush. J'ai le sentiment que ma réponse est déjà dans les réponses, mais voici quelques précisions de ce que je veux faire:
Je veux créer une seule instance d'un type spécifique (dit Singleton), mais que seule instance du type doit contenir une référence à un autre objet.
Par exemple, je pourrais avoir besoin de créer un Singleton "Statut" de la classe, qui possède un objet StringBuilder et une méthode Draw() qui peut être appelée à l'écriture dit StringBuilder à l'écran. La méthode Draw() a besoin de savoir à propos de mon GraphcisDevice afin d'en tirer.
Donc ce que je veux faire ceci:
public class Status
{
private static Status _instance;
private StringBuilder _messages;
private GraphicsDevice _gDevice;
private Status(string message, GraphicsDevice device)
{
_messages.Append(message);
_gDevice = device;
}
//The following isn't thread-safe
//This constructor part is what I'm trying to figure out
public static Status Instance //(GraphicsDevice device)
{
get
{
if (_instance == null)
{
_instance = new Status("Test Message!", device);
}
return _instance;
}
}
public void UpdateMessage
...
public void Draw()
{
//Draw my status to the screen, using _gDevice and _messages
}
}
Partout dans le code, j'ai récupérer mon Statut de Singleton et appeler sa UpdateMessage() la méthode.
private Status _status = Status.Instance; //+ pass reference to GraphicsDevice
_status.UpdateMessage("Foo!");
Puis, dans ma classe principale j'ai aussi récupérer le singleton, et de le faire:
_status.Draw();
Oui, cela signifie que partout où j'récupérer le singleton, j'ai besoin de le faire en passant par la référence à la GraphicsDevice, dans le cas où c'est la première fois que j'instancie le Singleton. Et je pourrais/voudrais utiliser différents moyens pour récupérer quelque chose d'aussi fondamental que la GraphicsDevice dans ma classe Singleton, par exemple s'inscrire à un service des autres et de s'service dans le Statut de la classe. Cet exemple a eu assez artificiel - je suis en train de voir si quelque chose comme ce modèle est possible en premier lieu.
- Ajout d'une bien meilleure explication de ce que je lui demande.
Vous devez vous connecter pour publier un commentaire.
Ce qui est généralement considéré comme une mauvaise idée, car si vous allez accepter soit une référence sur un objet ou d'un type d'argument que vous prévoyez sur l'emballage dans un singleton gestionnaire vous ne pouvez pas garantir que vous maintenez le seul exemple de ce type dans le domaine d'application.
Le point de l'ensemble de la pattern singleton est de contrôler une seule instance d'un type de sorte qu'une seule instance de ce type peuvent exister. Si vous permettez à une instance d'être passé, ou si vous faites un générique singleton fournisseur vous ne pouvez pas garantir que votre exemple est le seulement instance.
Disons que j'ai eu un
SingletonFactory<T>
qui me permettrait de créer un singleton autour de n'importe quel type que je passe à l'usine. Ce serait tout à fait à portée de main et me permettrait de faire quelque chose comme ceci:Mais ce qui m'arrête de le faire:
Oops, on dirait
Foo
n'est pas un singleton plus que je peux créer autant d'instances d'elle comme je le souhaite. Pour que le pattern singleton à travailler, vous devez être en mesure de contrôler complètement le type dont les cas, vous devez restreindre. C'est pourquoi vous ne devez pas utiliser quelque chose comme monSingletonFactory<T>
.Remarque: il en va de même pour un non-générique singleton qui accepte une instance d'objet. Je suis sûr que vous pouvez extrapoler à partir de mon exemple précédent, beaucoup de semblables raisons pour lesquelles un singleton wrapper qui accepte et l'objet de référence est également une mauvaise idée.
Ce que vous décrivez est un Générique de Singleton. Il ressemble à ceci:
http://www.codeproject.com/KB/cs/genericsingleton.aspx
Ce que vous êtes venu demander ressemble à ça, je pense:
Je soupçonne que la version générique déjà posté est ce que vous voulez vraiment, bien.
Vous avez besoin d'un constructeur privé et ensuite une méthode getInstance, cette méthode est de savoir qui devrait recevoir le param, le constructeur doit être privée et avoir des params aussi, mais getInstance devrait passer, pas de vous. Btw, ce que vous faites? Certains l'exemple réel pourrait aider.
Une chose que vous pouvez faire est peut-être coller à la singleton échantillon que vous avez trouvé et juste d'exposer une propriété (setter, si nécessaire, ajouter de lecture) et l'utiliser comme
MySingleton.Instance.MyReference = new MyObject();
Si vous devez restreindre l'utilisation de votre objet singleton, par exemple, toutes les opérations sur l'objet singleton avant la référence est définie besoin d'être illégale, vous pouvez avoir une private boolean flag, par exemple, hasBeenIntialized et MyReference setter sera mis le drapeau en interne. Toutes les autres méthodes de vérification de l'indicateur au début de l'exécution et de lever une exception si une méthode est appelée si hasBeenInitialized est faux.
Si vous avez besoin d'avoir un readonly comportement, vous pouvez lancer une exception dans MyReference setter si quelqu'un veut affecter un objet différent tout en hasBeenInitialized est définie sur true.