Le Singleton est un patron de conception de création qui s’assure de l’existence d’un seul objet de son genre et fournit un unique point d’accès vers cet objet.
Le singleton possède à peu près les mêmes avantages et inconvénients que les variables globales. Même s’ils sont super utiles, ils réduisent la modularité du code.
Vous ne pourrez pas utiliser une classe qui dépend d’un singleton dans un autre contexte. Vous devrez également inclure complètement la classe Singleton dans votre code. En général, on se rend compte de cette limitation lorsque l’on crée des tests unitaires.
Exemples d’utilisation : Beaucoup de développeurs considèrent que le singleton est un antipatron. C’est pourquoi il est de moins en moins utilisé en Java.
On retrouve tout de même de nombreux exemples de singletons dans les bibliothèques principales de Java :
Identification : Le singleton peut être reconnu par une méthode de création statique qui retourne le même objet en cache.
Singleton naïf (monothread)
Un singleton bâclé est facile à implémenter. Il suffit de cacher le constructeur et d’implémenter une méthode de création statique.
Singleton.java: Singleton
DemoSingleThread.java: Code client
OutputDemoSingleThread.txt: Résultat de l’exécution
Singleton naïf (multithread)
La même classe peut présenter des dysfonctionnements dans un environnement multithread. Plusieurs threads vont pouvoir appeler la méthode de création simultanément et créer plusieurs instances de la classe singleton.
Singleton.java: Singleton
DemoMultiThread.java: Code client
OutputDemoMultiThread.txt: Résultat de l’exécution
Singleton thread-safe avec instanciation paresseuse
Pour régler ce problème, vous devez synchroniser les threads lors de la première création de l’objet singleton.
Singleton.java: Singleton
DemoMultiThread.java: Code client
OutputDemoMultiThread.txt: Résultat de l’exécution
Vous en voulez plus ?
Il y a plein d’autres variétés spéciales du singleton en Java. Jetez un œil à cet article (en anglais) pour en découvrir d’autres :