Définition
Le singleton est un des designs patterns le plus simple à utiliser dont l’objectif est de restreindre l’instanciation d’une classe à un seul objet.
Fonctionnement
On implémente le singleton en écrivant une classe contenant une méthode qui crée une instance uniquement s’il n’en existe pas encore. Sinon elle renvoie une référence vers l’objet qui existe déjà.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
internal class Singleton { private static Singleton _instance; protected Singleton() { } public static Singleton Instance() { if (_instance == null) { _instance = new Singleton(); } return _instance; } } |
Exemple d’utilisation
Prenons l’exemple du stockage de l’utilisateur qui se connecte à l’application, on désire le stocker dans le singleton pour accéder à ses informations comme sa photo de profil ou son pseudo. Nous avons ajouté une variable privée et ses accesseurs GET/SET au singleton appelé DonnéesManager. Le GET nous renvoi la variable privée et le SET ne stocke la valeur uniquement si la variable privée est NULL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
internal class DonnéesManager { private static DonnéesManager _instance; protected DonnéesManager() { } public static DonnéesManager Instance() { if (_instance == null) { _instance = new DonnéesManager(); } return _instance; } private Utilisateur _utilisateurConnecté; public Utilisateur UtilisateurConnecté { get { return _utilisateurConnecté; } set { if (_utilisateurConnecté == null) { _utilisateurConnecté = value; } } } } |
Pour ajouter l’utilisateur au singleton il suffit de passer par à la propriété UtilisateurConnecté.
1 |
DonnéesManager.Instance().UtilisateurConnecté = new Utilisateur(); |
Pour récupérer l’utilisateur que l’on vient de stocker, nous n’avons plus qu’à ré-utiliser la propriété UtilisateurConnecté.
1 |
Utilisateur utilisateurConnecté = DonnéesManager.Instance().UtilisateurConnecté; |
Aller plus loin
Si l’on a besoin de re-créer l’instance pour recharger les données attachées par exemple, il suffit d’ajouter à la classe une méthode statique Reset() qui va écraser la variable _instance avec une valeur NULL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
internal class DonnéesManager { private static DonnéesManager _instance; protected DonnéesManager() { } public static DonnéesManager Instance() { if (_instance == null) { _instance = new DonnéesManager(); } return _instance; } private Utilisateur _utilisateurConnecté; public Utilisateur UtilisateurConnecté { get { return _utilisateurConnecté; } set { if (_utilisateurConnecté == null) { _utilisateurConnecté = value; } } } public static void Reset() { if (_instance != null) { _instance = null; } } } |