Cet article sera le premier d’une série de 7 articles traitant de l’implémentation des principaux design pattern en ActionScript 3, avec une présentation théorique et un exemple pratique.
Aujourd’hui le Singleton
Le singleton est le design pattern le plus simple à mettre en place. Le but 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.Il sera surtout utilisé pour un contrôleur présent dans un MVC (Modèle Vue Contrôleur) qui sera compose d’autres objets de contrôleurs. 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 qui possèdera une méthode créant une instance uniquement s’il n’en existe pas encore. Sinon elle renvoie une référence vers l’objet qui existe déjà.
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.
Voici un exemple d’implémentation :
package
{
public class example
{
// on définit une variable statique Booléenne permettant de savoir si l'objet est créé
private static var _fromGetInstance:Boolean = false;
// c'est l'objet en lui même , il est statique et private pour que seule la classe puisse y accéder
private static var _uniqueInstance:example;
// méthode d'accès à l'objet du singleton , il peut être remplacé par un getter qui sera lui aussi en public static.
// la méthode retourne l'objet et vérifie sa disponibilité
public static function getInstance():LoadingModal
{
if(! _uniqueInstance)
{
_fromGetInstance = true;
_uniqueInstance = new LoadingModal();
}
return _uniqueInstance;
}
// constructeur de la classe
// on ne peut pas créer de nouveaux objets par le constructeur sinon cela renvoie une erreur
public function example()
{
if(!_fromGetInstance)
{
throw new Error("interdit");
}
_fromGetInstance = false;
}
}
}