J'ai rencontré un problème aujourd'hui et un ami a recommandé d'utiliser une instance statique globale ou plus élégamment un singleton. J'ai passé quelques heures à lire sur des singletons, mais quelques choses m'échappent encore.
Contexte: Ce que je suis essayant d'accomplir, c'est créer une instance d'une API et utiliser cette instance dans toutes mes classes (par opposition à la création d'une nouvelle connexion, etc.). P>
Il semble y avoir environ 100 façons de créer un singleton mais avec de l'aide de yoda j'ai trouvé des Exemples de sécurité. .. > Modifier:
Je réalise que la classe Singleton peut être appelée avec quelque chose comme p> mais pourrais-je accéder aux méthodes de la classe APIS (c.-à-d. Obj1.start)? (Pas que j'ai besoin de, juste demander) p> Edit # 2: J'aurais peut-être été un peu prématuré dans la vérification de la réponse, mais j'ai une petite chose qui me fait toujours me causer des problèmes. L'API lance juste bien, je suis malheureusement capable de lancer deux instances? P> nouveau code p> mais si j'essaie de faire quelque chose comme ça .. . p> Je reçois une erreur disant que je ne peux pas commencer plus d'une instance. p> p>
3 Réponses :
Vous ne voudriez pas instancier la classe - le modèle que vous utilisez essentiellement instancie la première fois qu'il est utilisé. L'avantage de la méthode que vous utilisez est que son fil est en sécurité (instancier uniquement une fois, peu importe le nombre de discussions tentent d'y accéder), paresseux (il n'instanciera pas avant d'essayer d'accéder à la classe Singleton) et simple Dans la mise en œuvre.
Tout ce que vous avez à faire pour utiliser ceci est de faire: p> ou, alternativement: p>
De plus, je recommanderais Farstucker surveiller sur Singletons sur msdn msdn.microsoft.com/en- US / Bibliothèque / MS998558.aspx
Croyez-le ou non, j'ai lu ça. Je suppose que je viens de confondre comment instancier une classe complètement différente et l'utiliser à l'échelle mondiale. J'ai ajouté du code pour aider à expliquer ce que je tente de faire.
voici le approche officielle Microsoft . p>
La beauté du singleton est que vous pouvez utiliser et y accéder n'importe où dans votre code sans avoir à créer une instance de la classe. En fait, c'est que c'est la raison d'être, une seule instance d'une classe, par exemple p>
singleton.instance.myvalue em> et singleton.instance.dosomething (); em> p> p>
Pourquoi ne pas simplement ajouter une propriété d'apiclass publique à votre singleton? Ensuite, votre site d'appel ressemble à: p> ou si Vous êtes l'auteur de la classe API, vous pouvez en faire un singleton lui-même, au lieu de l'envelopper dans un singleton: P> SingletonAPI.Instance.DoSomething();
@chals merci beaucoup, c'est exactement ce dont j'avais besoin.
Vous devez également ajouter un constructeur privé, également pour empêcher une autre classe d'instantifier une copie de votre singleton.
Vous ne pourrez pas appeler des méthodes sur la classe API, car il n'est pas exposé.
En effet, vous pouvez insérer un objet Apiclass dans le constructeur singleton privé. Étant donné que le constructeur privé ne sera jamais invoqué une fois, à partir du constructeur statique, Afaik est tout bon. Vous avez déclaré que l'apiclass est une variable locale cependant, la portée est donc que dans le constructeur privé. Vous devrez redéclairez-le comme membre privé au moins si vous souhaitez l'utiliser au-delà de cela.
Sur une note latérale, si vous avez déjà une classe API qui encapsule l'API complète, vous pouvez toujours instancier l'apiclasse en tant que membre statique d'une classe, plutôt que de l'envelopper dans son propre singleton.
Farstucker, en ce qui concerne votre édition n ° 2, tout d'abord, je pense que vous comprenez cela, mais dans votre exemple API et API2 se réfèrent exactement au même objet - c'est le singleton au travail. Deuxièmement, n'instentiez pas votre API dans une méthode publique. Instanciez-le dans le constructeur privé du singleton. De cette façon, cela ne sera instancié qu'une fois. (C'est exactement ce que j'ai montré dans ma réponse. Je ne suis pas sûr, vous avez peut-être vu ma réponse après avoir écrit Edition n ° 2)
@Chalars merci encore d'être patient avec moi. L'instanciation dans le constructeur a résolu le problème.
Bonne chance! Si vous rencontrez des problèmes de multithreading, l'article MSDN mentionné ci-dessous a une aide supplémentaire.
@Reed Copsey La classe est scellée, ai-je encore besoin d'un constructeur?
@Farstuker: Oui. Scellé n'empêche simplement que le sous-classement, mais n'empêche pas la construction.