Design Patterns - Le Singleton
Dans cette quête tu apprendras à utiliser le design pattern du Singleton
Un design pattern
Les développeurs font souvent face aux mêmes types de problèmes tous les jours, et cela à l'international. Nous faisons face quasi-constamment à de la difficulté et trouver des solutions ingénieuses, efficaces et extensibles n'est pas tâche facile.
Afin de nous aider, la communauté a révélé au grand jour l'existence de Design Patterns, c'est-à-dire de patrons de conception. Ces patrons de conception résolvent des problèmes récurrents de manière raffinée. L'utilisation de certaines patrons de conception améliorent grandement la modularité et l'extensibilité du code. Souvent au détriment de la simplicité.
Quoiqu'il en soit, le monde des développeurs est rempli de design patterns, alors tu vas en apprendre un très utile et facile à mettre en place. Il s'agit du Singleton.
Une instance unique
Il peut arriver assez souvent que tu souhaites disposer d'une unique instance d'un objet, tout au long de l'exécution de ton code. Tu aimerais bien que la même classe ne soit pas instanciée deux fois dans la même application, mais bien une seule fois et cela pour tout le programme.
Le design pattern du Singleton répond au cas où tu veux qu'une unique instance d'un objet traverse toute une application, et cela indépendamment du nombre de dépendences que les autres classes ont avec la classe "singletonnée".
Cependant, il est à noter que le Singleton n'est pas toujours adapté à tous les cas où l'on veut une seule et unique instance d'un objet. Il est possible de réaliser cela autrement, notamment en utilisant une variable globale ou une classe entièrement statique. Cependant ces solutions ne sont pas toujours les plus propres. L'équipe de développement est responsable du choix des bons design patterns dans les cas qui conviennent.
Dans quels cas je peux m'en servir alors ?
Ce design pattern est utile dans peu de situations. Une situation où il pourrait être utile est le cas où un accès à une base de données est réalisé à l'aide d'une classe et que la connexion vers la base ne doit pas être dupliquée. Dans ce cas, singletonner la base de données rend le code plus stable et crée **une seule et même instance **de la base de données dans tous les modules qui l'utiliseront.
L'implémentation
L'implémentation du Singleton est très simple comparée aux autres design patterns. Il s'agit du design pattern le plus simple de tous.
L'idée du Singleton est de fournir une instance d'un objet instanciée de manière fainéante, c'est-à-dire qu'à partir du moment où une instance est demandée, puis de ne plus jamais l'instancier une fois qu'on y accède de nouveau.
L'implémentation du Singleton est fait grâce à une méthode statique appartenant à la classe "Singletonnée". La classe Singletonnée possède une instance d'elle-même dans un attribut statique et privé. Cet attribut est par défaut à une valeur nulle et dès lors qu'un appel est réalisé à une méthode GetInstance(), l'instance est affectée à un attribut statique et privé si elle n'existe pas puis l'attribut statique et privée est renvoyé dans tous les cas.
Aussi, et ceci afin d'éviter toute confusion, aucun constructeur n'est accessible à l'extérieur de la classe singletonnée_. _Autrement les utilisateurs du code pourraient se méprendre et désirer créer une instance non-singletonnée de la classe.
Challenge
A l'attaque
Ecris deux classes ayant besoin d'une connexion à une base de données. Ecris une troisième classe réalisant une connexion à une base de données et permettant de réaliser des requêtes SQL à l'aide de celle-ci. La classe se connectant à la base de données doit être singletonnée.
Critères de validation
-
Deux classes utilisant une base de données sont écrites
-
Ces deux classes possèdent un attibut
Database -
Une classe
DatabaseSingletonimplémente le design pattern du Singleton -
Cette classe
DatabaseSingletonest crée de manière fainéante et est utilisée dans les deux autres classes ayant besoin d'une connexion -
DatabaseSingletonn'a aucun constructeur public -
Une propriété ou méthode statique de
DatabaseSingletonrenvoie une instance d'elle-même