Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation correcte d'un singleton

    7 octobre 2011 à 10:39:37

    Bonjour à tous,

    J'ai une question tout bête, je voudrais instancier une form fille une seule fois dans une form MDI.
    J'ai trouvé plusieurs infos contradictoires sur la manière d'instancier un objet singleton.
    Aussi je poste mon code, pour avoir votre avis sur la question:

    Feuille mère (conteneur MDI):
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace singleton_test
    {
        public partial class Mere : Form
        {
            public Mere()
            {
                InitializeComponent();
            }
    
            private void btnTest_Click(object sender, EventArgs e)
            {
                Fille fille = Fille.GetInstance();
                fille.MdiParent = this;
                fille.Show();
            }
        }
    }
    


    Feuille fille:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace singleton_test
    {
        public partial class Fille : Form
        {
            private static Fille m_Instance; //instance vaut null par defaut
    
            
            public static Fille GetInstance()
            {
                if (m_Instance == null)
                {
                    m_Instance = new Fille();
                }
                return m_Instance; 
            }
    
            private static Fille KillInstance()
            {
                if (m_Instance != null)
                {
                    m_Instance = null;
                }
                return m_Instance;
            }
    
            private Fille()
            {
                InitializeComponent();
            }
    
            private void Fille_FormClosing(object sender, FormClosingEventArgs e)
            {
                KillInstance();
            }
        }
    }
    


    Ce code marche , mais je ne sais pas si c'est la bonne manière de faire.
    Si quelqu'un peut confirmer (ou infirmer :p ) ..
    Merci d'avance ^^
    • Partager sur Facebook
    • Partager sur Twitter
      7 octobre 2011 à 10:51:43

      Salut,

      Dans un singleton le constructeur doit être private, sinon ça sert à rien de faire une méthode GetInstance().
      Sinon pour le reste, rien de particulier à dire. Tu as choisi de le faire via une méthode, on peut aussi le faire via une property ( ça revient au même au final ).
      • Partager sur Facebook
      • Partager sur Twitter
        7 octobre 2011 à 11:22:12

        Ah oui, j'ai fait une erreur en copiant le code, merci de me le faire remarquer, je corrige ça. ^^
        Merci pour ta réponse, je vais tester avec une propriété pour m'entrainer.

        Une petite question subsidiaire malgrès tout :p
        Mon prof me dit qu'il y'a une méthode toute prête pour n'instancier un objet qu'une fois, mais qu'il ne se souvient plus son nom... :euh:

        j'ai eu beau chercher au quatre coins du net , je n'ai trouvé que la solution du singleton.

        Aussi si tu as idée..
        Merci :)
        • Partager sur Facebook
        • Partager sur Twitter
          7 octobre 2011 à 12:23:39

          Citation : zrt


          Une petite question subsidiaire malgrès tout :p
          Mon prof me dit qu'il y'a une méthode toute prête pour n'instancier un objet qu'une fois, mais qu'il ne se souvient plus son nom... :euh:

          j'ai eu beau chercher au quatre coins du net , je n'ai trouvé que la solution du singleton.

          Aussi si tu as idée..



          Jamais entendu ça. J'ai cherché sur le net et dans la msdn, j'ai rien trouvé. J'suis curieux d'en savoir plus si quelqu'un qui passe dans le coin voit de quoi il s'agit.

          Sinon au passage quelques petits compléments sur le sujet :
          Implementing the singleton
          Generic singleton with reflection
          Singleton vs Static
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2011 à 13:05:49

            Une classe possède un constructeur statique, appelé une seule fois. Il devait surement faire référence à ça.

            namespace singleton_test
            {
                public partial class Fille : Form
                {
                    private static Fille m_Instance; //instance vaut null par defaut
            
                    static Fille()
                    {
                        m_Instance = new Fille();
                    }
            [...]
            


            Néanmoins, cela revient au même que d'écrire

            namespace singleton_test
            {
                public partial class Fille : Form
                {
                    private static Fille m_Instance = new Fille();
            [...]
            
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2011 à 16:44:56

              Ou alors il pensait au mot-clé readonly, que l'on utilise pour les membres de classes qui ne peuvent être initialisés que dans le constructeur (ou dans la définition de la classe), et qui les rend impossible à modifier après une création d'instance.

              public class MaClasse
              {
                  private readonly string _maString;
              
                  public MaClasse
                  {
                      _maString = "foo"; // ok, unique assignation autorisée
                  }
              
                  public void Bar()
                  {
                      _maString = "zorg"; // interdit
                  }
              }
              


              En combinant ce mot-clé avec le mot-clé static, on peut définir un membre statique qui ne peut être initialisé qu'une et une seule fois. Cependant ça ne concerne que l'initialisation de ce membre, pas l'instanciation du type de ce membre : le fait de déclarer un membre static readonly Foo _unFoo n'empêche pas de créer plusieurs objets Foo. Ca empêche juste de modifier la référence statique _unFoo.
              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2011 à 18:12:27

                Ouais c'est bien se que je pensais on reste dans le cadre du pattern et mot clé pour le mettre en place.
                Merci pour la confirmation j'ai eu peur pendant un moment ...
                • Partager sur Facebook
                • Partager sur Twitter
                  7 octobre 2011 à 18:35:48

                  Citation : zrt

                  Ah oui, j'ai fait une erreur en copiant le code, merci de me le faire remarquer, je corrige ça. ^^
                  Merci pour ta réponse, je vais tester avec une propriété pour m'entrainer.

                  Une petite question subsidiaire malgrès tout :p
                  Mon prof me dit qu'il y'a une méthode toute prête pour n'instancier un objet qu'une fois, mais qu'il ne se souvient plus son nom... :euh:

                  j'ai eu beau chercher au quatre coins du net , je n'ai trouvé que la solution du singleton.

                  Aussi si tu as idée..
                  Merci :)



                  Je me demande, personnellement, s'il ne fait pas plutôt référence, à cette option disponible sur les projets Winforms VB.Net, qui rend l'application à instance unique (et donc la "singletonize" :lol: )
                  Image utilisateur

                  Cordialement !
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Censément, quelqu'un de sensé est censé s'exprimer sensément.
                    7 octobre 2011 à 18:48:06

                    Merci pour toutes ces infos pertinentes, ça valait le coup de poser la question subsidiaire :p

                    @Sehnsucht: je ne pense pas, il faisait plutôt référence à l'instanciation d'une feuille fille au sein d'une application WinForm MDI.
                    Par contre, je ne vois pas ou se trouve l'option que tu cites sur mon IDE (visual studio 2010)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 octobre 2011 à 21:21:19

                      Citation : zrt

                      @Sehnsucht: je ne pense pas, il faisait plutôt référence à l'instanciation d'une feuille fille au sein d'une application WinForm MDI.
                      Par contre, je ne vois pas ou se trouve l'option que tu cites sur mon IDE (visual studio 2010)



                      Elle n'existe (à ma connaissance en tout cas) que pour les projets (Winforms ? à voir pour WPF) VB.Net et elle se trouve dans les propriétés du projet.

                      Cordialement !
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Censément, quelqu'un de sensé est censé s'exprimer sensément.
                        13 octobre 2011 à 19:47:35

                        Citation : Sehnsucht

                        Elle n'existe (à ma connaissance en tout cas) que pour les projets (Winforms ? à voir pour WPF) VB.Net et elle se trouve dans les propriétés du projet.

                        Cordialement !



                        En effet, après vérification, cette option n'est disponible que pour les projets WinForms en VB.NET.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Utilisation correcte d'un singleton

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown