Singleton (patron de conception)

Transcription

Singleton (patron de conception)
Patron de conception
Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Design pattern)
Aller à : Navigation, Rechercher
En génie logiciel, un patron de conception (design pattern en anglais) est un concept destiné à
résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise aussi le terme
motif de conception qui est une traduction alternative de «design pattern», perçue comme
incorrecte par certains.
Les patrons de conception décrivent des solutions standards pour répondre à des problèmes
d'architecture et de conception des logiciels. À la différence d'un algorithme qui s'attache à décrire
d'une manière formelle comment résoudre un problème particulier, les patrons de conception
décrivent des procédés de conception généraux. On peut considérer un patron de conception comme
une formalisation de bonnes pratiques, ce qui signifie qu'on privilégie les solutions éprouvées (un
patron de conception n'est considéré comme « prouvé » qu'une fois qu'il a été utilisé avec succès au
moins dans trois cas).
But général
[modifier]
Le but général des patrons de conception est de minimiser les interactions qu'il peut y avoir entre les
différentes classes (ou modules, plus généralement) d'un même programme. L'avantage de ces
patrons est de diminuer le temps nécessaire au développement d'un logiciel et d'augmenter la qualité
du résultat, notamment en appliquant des solutions déjà existantes à des problèmes courants de
conception. Ils sont là pour éviter la présence d'anti-patrons. Ils sont aussi utiles pour définir un
vocabulaire commun entre les différents acteurs de l'écriture d'un logiciel.
Ces patrons sont décrits sous une forme abstraite, sans s'attacher aux détails du problème à
résoudre.
Histoire
[modifier]
Formalisé dans le livre du « Gang of Four » (GoF, Erich Gamma, Richard Helm, Ralph Johnson et
John Vlissides) intitulé « Design Patterns -- Elements of Reusable Object-Oriented Software » (voir
bibliographie) en 1995, les patrons de conception tirent leur origine des travaux de l'architecte
Christopher Alexander dans les années 70.
Citations [modifier]
•
« Chaque patron décrit un problème qui se manifeste constamment dans notre
environnement, et donc décrit le cœur de la solution à ce problème, d’une façon telle que
l’on puisse réutiliser cette solution des millions de fois, sans jamais le faire deux fois de la
même manière » Christopher Alexander - 1977.
•
« Les patrons offrent la possibilité de capitaliser un savoir précieux né du savoir-faire
d’experts » [Buschmann] - 1996.
Singleton (patron de conception)
Un article de Wikipédia, l'encyclopédie libre.
En génie logiciel, le singleton est un patron de conception (design pattern) dont l'objet est de
restreindre l'instanciation d'une classe à un seul objet (ou bien quelques objets seulement). Il est
utilisé lorsque l'on a besoin d'exactement un objet pour coordonner des opérations dans un système.
Le modèle est parfois utilisé pour son efficacité, lorsque le système est plus rapide ou occupe moins
de mémoire avec peu d'objets qu'avec beaucoup d'objets similaires.
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à.
Dans beaucoup de langages de type objet, il faudra veiller à ce que le constructeur de la classe soit
privé ou bien protégé, afin de s'assurer que la classe ne puisse être instanciée autrement que par la
méthode de création contrôlée.
Le singleton doit être implémenté avec précaution dans les applications multi-thread. Si deux
threads exécutent en même temps la méthode de création alors que l'objet unique n'existe pas
encore, il faut absolument s'assurer qu'un seul créera l'objet, et que l'autre obtiendra une référence
vers ce nouvel objet.
La solution classique à ce problème consiste à utiliser l'exclusion mutuelle pour indiquer que l'objet
est en cours d'instanciation.
Java
[modifier]
Voici une solution écrite en Java (il faut écrire un code similaire pour chaque classe-singleton):
public class Singleton {
private static Singleton INSTANCE = null;
/**
* La présence d'un constructeur privé supprime
* le constructeur public par défaut.
*/
private Singleton() {}
/**
* Le mot-clé synchronized sur la méthode de création
* empêche toute instanciation multiple même par
* différents threads.
* Retourne l'instance du singleton.
*/
public synchronized static Singleton getInstance() {
if (INSTANCE == null)
INSTANCE = new Singleton();
return INSTANCE;
}
}
Une solution variante existe cependant. Elle consiste à alléger le travail de la méthode getInstance
en déplaçant la création de l'instance unique au niveau de la déclaration de la variable référant
l'instance unique:
public class Singleton {
/**
* Création de l'instance au niveau de la variable.
*/
private static final Singleton INSTANCE = new Singleton();
/**
* La présence d'un constructeur privé supprime
* le constructeur public par défaut.
*/
private Singleton() {}
/**
* Dans ce cas présent, le mot-clé synchronized n'est pas utile.
* L'unique instanciation du singleton se fait avant
* l'appel de la méthode getInstance(). Donc aucun risque d'accès concurrents.
* Retourne l'instance du singleton.
*/
public static Singleton getInstance() {
return INSTANCE;
}
}
static
Le caractère static d'un propriété (un attribut ou une méthode essentiellement) dénote une propriété
directement liée au module de classe dans lequel elle est définie. Dit autrement, une propriété
static n'est pas liée à une instance, et c'est pourquoi il est toujours préférable de la préfixer
explicitement par le nom de sa classe. Exemple :
...
double x = Math.PI * 2;
double y = -x;
...
double z = Math.abs(x);
...
PI est un attribut de classe (pas un attribut d'instance !), tout comme abs est une fonction utilitaire
du module java.lang.Math (le package java.lang étant le package par défaut, inutile de le déclarer).
La documentation de l'API nous confirme que ces propriétés sont bien libéllées static :
Figure 15. Exemple de propriétés liées à une classe (static)
Les propriétés static sont ordinairement initialisées par des instructions placées dans un bloc static,
équivalent des constructeurs d'objets. Les blocs static sont exécutés au chargement de la classe.
=> En mémoire il n'y a au plus qu'une "instance" d'un module de classe et 0 à n instances de cette
classe.