{"id":231,"date":"2015-02-22T13:46:33","date_gmt":"2015-02-22T13:46:33","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=231"},"modified":"2015-06-23T10:57:13","modified_gmt":"2015-06-23T10:57:13","slug":"le-singleton","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=231","title":{"rendered":"Le Singleton"},"content":{"rendered":"<p><strong>Intro :<\/strong><\/p>\n<p>Le Singleton est un <span class=\"highLT\">patron de conception.<\/span><\/p>\n<p>Il est utile lorsque l&rsquo;on a besoin d&rsquo;utiliser et d&rsquo;instancier un seul objet au lieu le passer param\u00e8tre apr\u00e8s param\u00e8tre et fonction par fonction.<\/p>\n<p>En somme il permet d&rsquo;acc\u00e9der directement dans tout le programme un objet quelconque (appel\u00e9 \u00ab\u00a0Singleton\u00a0\u00bb).<\/p>\n<p><strong>Explications \/ exemples :<\/strong><\/p>\n<p><em>Cas sans le Singleton :<\/em><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ on passe le param\u00e8tre fonction apr\u00e8s fonction\r\nvoid une_foncton(Object* obj)\r\n{\r\n    une_autre_fonction(obj);\r\n}\r\n\r\n\/\/ et encore un param\u00e8tre de pass\u00e9...\r\nvoid une_autre_fonction(Object* obj)\r\n{\r\n    std::string sName = obj-&gt;getName();\r\n\r\n    std::cout &lt;&lt; sName &lt;&lt; std::endl;\r\n}\r\n<\/pre>\n<p><em>Cas avec le Singleton :<br \/>\n<\/em><\/p>\n<p>On acc\u00e8de directement \u00e0 l&rsquo;objet sans avoir \u00e0 le passer param\u00e8tre par param\u00e8tre :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nvoid une_autre_fonction()\r\n{\r\n    Object-&gt;getSingleton()-&gt;getName();\r\n}\r\n\r\n<\/pre>\n<p>Donc\u00a0 :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ Cette fonction n'est plus utile\r\nvoid une_foncton(Object* obj) \r\n\r\n<\/pre>\n<p><strong><br \/>\nVoici le fichier d&rsquo;en-t\u00eate \/ d&rsquo;include :<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#ifndef SINGLETON_H\r\n#define SINGLETON_H\r\n\r\n#define SAFE_DELETE(p) if (p) { delete (p); (p) = NULL; }\r\n\r\ntemplate &lt;typename T&gt;\r\nclass Singleton\r\n{\r\npublic:\r\n    Singleton()\r\n    {\r\n        assert(!ms_instance);\r\n\r\n        ms_instance = static_cast&lt;T*&gt;(this);\r\n    }\r\n\r\n    ~Singleton () {}\r\n\r\n    static T* getSingletonPtr()\r\n    {\r\n        assert(ms_instance);\r\n\r\n        return ms_instance;\r\n    }\r\n\r\n    static void destroy()\r\n    {\r\n        SAFE_DELETE(ms_instance);\r\n    }\r\n\r\n\u00a0\u00a0\u00a0 static bool IsCreated()\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return ms_instance != nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\nprivate: \/\/ Op\u00e9ration interdite\r\n    Singleton(const Singleton&lt;T&gt; &amp;);\r\n    Singleton&amp; operator=(const Singleton&lt;T&gt; &amp;);\r\n\r\nprivate:\r\n    static T* ms_instance;\r\n};\r\n\r\n#endif\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Utilisation :<\/strong><\/p>\n<p>Dans le fichier include : EventManager.h<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nclass EventManager : public Singleton&lt;EventManager&gt;\r\n{\r\n    \/\/ Suite de votre code...\r\n};\r\n\r\n<\/pre>\n<p>Dans le fichier cpp : EventManager.cpp<\/p>\n<p>on doit mettre tout en haut de ce fichier :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\ntemplate&lt;&gt; EventManager* Singleton&lt;EventManager&gt;::ms_instance = NULL;\r\n\r\n<\/pre>\n<p><strong><br \/>\nExemple d&rsquo;utilisation :<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nGlobalSystems::GlobalSystems()\r\n{\r\n    m_pInputManager = InputManager::getSingletonPtr();\r\n    m_pTextAnnouncer = TextAnnouncer::getSingletonPtr();\r\n    m_pCameraManager = CameraManager::getSingletonPtr();\r\n    m_pConsole = Console::getSingletonPtr();\r\n}\r\n\r\n<\/pre>\n<p><strong>Astuces et conseils :<\/strong><\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/warning.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-270\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/warning.png\" alt=\"warning\" width=\"120\" height=\"100\" \/><\/a><\/p>\n<p><strong>1 &#8211;<\/strong> N&rsquo;oubliez surtout pas de cr\u00e9er votre objet avant son utilisation en appelant :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nnew NomDeLaClasse();\r\n\r\n<\/pre>\n<p>sinon vous obtiendrez un bug de pointeur non initialis\u00e9 ! (segfault)<\/p>\n<p><strong>2 &#8211;<\/strong> Utiliser plusieurs macro #define de la sorte :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define EVENT_MANAGER EventManager-&gt;getSingleton()\r\n\r\n<\/pre>\n<p>on utilise cette macro \/ raccourcis pour appeler une m\u00e9thode : EVENT_MANAGER-&gt;methode()<br \/>\ncela permet de simplifier l&rsquo;\u00e9criture du code&#8230;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Le patron de conception Singleton restreint l&rsquo;instanciation d&rsquo;une classe \u00e0 un seul objet.<br \/>\nIl permet de simplifier l&rsquo;acc\u00e8s global \u00e0 un objet (par exemple \u00e0 une classe TextureManager ou EventManager)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Le Singleton est un patron de conception. Il est utile lorsque l&rsquo;on a besoin d&rsquo;utiliser et d&rsquo;instancier un seul objet au lieu le passer param\u00e8tre apr\u00e8s param\u00e8tre et fonction par fonction. En somme il permet d&rsquo;acc\u00e9der directement dans tout le programme un objet quelconque (appel\u00e9 \u00ab\u00a0Singleton\u00a0\u00bb). Explications \/ exemples : Cas sans le [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/231"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=231"}],"version-history":[{"count":59,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":2585,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/231\/revisions\/2585"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}