
Le singleton est ce qu'on appelle un design pattern (patron de conception en Français).
C'est un outil qui va nous permettre de créer des classes instanciables une seule fois par programme.
Une classe singleton ne peut donc jamais être instanciée plusieurs fois.
C'est plus utile qu'on ne l'imagine... Pour la gestion des ressources par exemple.
C'est une méthode assez courante sur laquelle beaucoup de chose ont été écrites. Nous n'allons donc pas vous expliquer en détails l'implémentation de la chose, mais plutôt le principe, en grandes lignes.
Vous devriez être capables de les coder vous mêmes. Si vous avez du mal, le code du KGG est là pour vous aider (attention toutefois, il est sous licence LGPL ;) ).
Comme indiqué dans l'introduction, le but des singletons est de faire en sorte qu'on ne puisse instancier qu'une seule fois une classe.
Il peut exister plusieurs bonnes raisons de vouloir faire ça : par exemple pour les classes gérant des ressources ou de la mémoire.
Elles perdraient tout leur intérêt si elle n'étaient pas uniques : en répartissant les ressources d'un même type, sur plusieurs gestionnaires, bonjour les dégâts !
L'idée générale est de filtrer l'accès à la classe pour qu'on ne puisse pas l'instancier n'importe comment.
Pour ce faire, il faut commencer par mettre les constructeurs et destructeurs en private, de manière à ce qu'ils ne soient pas accessibles depuis l'extérieur.
Vous trouvez peut être ça bizarre, mais c'est tout à fait possible et on s'en sert dans certains cas (ici par exemple).
Néanmoins il va bien falloir instancier la classe, au moins une fois.
Nous allons donc faire une méthode, interne à la classe, qui renvoie l'instance de celle-ci. Cette méthode sera publique, et elle contrôlera l'accès à l'instance, de manière à ne la créer que si une instance n'existe pas déjà. Dans le cas contraire, on reverra simplement l'instance précédemment crée !
Mais cette fameuse méthode ne peut être utilisée au travers d'un objet, ça serait un peu idiot.
Nous allons donc créer une méthode qui est propre à la classe, et non à un objet particulier. C'est ce qu'on appelle une méthode statique.
Elle se déclare en tout points de la même manière qu'une méthode traditionnelle, sauf qu'elle comporte le mot clef "static" devant son prototype.
Une méthode statique est un peu comme une fonction, externe à la classe, mais avec le préfixe nomDeLaClasse:: devant son nom. Une méthode statique peut accéder aux attributs statiques de la classe uniquement, et pas aux autres méthodes ni aux autres attributs, qui sont différenciés pour chaque objet.
Nous créons donc une méthode statique qui instancie la classe et retourne l'instance, puis qui stocke l'adresse de cette instance dans un pointeur static. Il s'agit aussi par conséquent d'un attribut statique.
Il est semblable aux méthodes statiques : il se déclare comme un attribut, mais avec le mot clé 'static'. Il est comme une variable globale, dont le nom comporte le préfixe nomDeLaClasse::. Sauf que s'il est private, seuls les méthodes statiques de la classe ou encore les méthodes normales des objets pourront y accéder.
Ainsi, notre pointeur statique est initialisé à NULL. Notre méthode statique vérifie si ce pointeur est à NULL. Si oui, elle instancie la classe et fait pointer ce pointeur statique sur l'instance.
Enfin, dans tous les cas, elle retourne une copie de ce pointeur, qui pointera toujours sur UN objet valide.
Vous trouverez une implémentation de ce qui est décrit ci-dessus dans le code du KGG of course ^^ : URL
Et comme promis, voici un lien vers un tutoriel qui explique de A à Z comment coder des singletons :
http://tfc.duke.free.fr/coding/singleton.html
Tout cela est un peu compliqué, donc n'hésitez pas à bien le méditer.
Nous n'avons pas tout dit, il faut employer quelques astuces pour créer une classe singleton.
Cherchez sur le web, vous trouverez.
Nous ne sommes pas experts en singletons, nous ne préférons donc pas rentrer dans les détails et vous dire une bêtise.
Surtout que ce tutoriel est basé sur la recherche et l'écriture de code personnelles... :)