Lors du développement d’applications, le Singleton est un modèle de conception dont l’objet est de restreindre l’instanciation d’une classe à un seul objet.
Présentation
Le pattern Singleton 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.
En flash ActionScript, le Pattern Singleton est surtout utilisé pour créer classe Main (le point d’entrée) de l’application. Ensuite, il est utilisé pour des classes bien spécifiques ne nécessitant d’être instanciée plusieurs fois.
Définition
Le Singleton est mis en œuvre en écrivant une classe contenant une méthode statique qui crée une instance uniquement si elle n’existe pas encore. Sinon elle renvoie une référence vers l’objet qui existe déjà.
Nous devons aussi nous assurer que la classe ne puisse être instanciée autrement que par la méthode de création contrôlée. C’est pourquoi dans des langages comme Java et C++, le constructeur de la classe est déclaré comme privé ou protégé. Malheureusement en ActionScript 3, un constructeur ne peut-être que public.
Implémentation du Design Pattern Singleton en AS3
En AS3, il existe plusieurs méthodes pour implémenter le Design Pattern Singleton. Chaque développeur a ses préférences.
La mienne consiste à affecter à une variable privé statique l’instance de la classe. La méthode public statique renvoie dans tous les cas l’instance unique de la classe. L’instance se créer automatiquement et une seule fois si besoin.
L’avantage de cette technique est qu’il n’y a pas besoin de vérifier si l’instance a déjà été créée.
Il n’est pas possible d’instancier directement la classe via son constructeur. Un message d’erreur est généré.
Exemple de classe AS3 Singleton
package com.utils { import vegas.logging.Log; import vegas.logging.ILogger; /** * Modify contextuel menu of flash * * @usage : ExpressInstall.getInstance(); * * * @class ExpressInstall * @author Matthieu * @version 0.1 */ public class ExpressInstall { private static var _oInstance : ExpressInstall = new ExpressInstall();// unique instance private var _oLogger : ILogger; /** * CONSTRUCTOR * @usage * @return */ public function ExpressInstall() { if( _oInstance ) throw new Error( "ExpressInstall can only be accessed through ExpressInstall.getInstance()" ); _oLogger = Log.getLogger(Utils.CHANNEL_DEBUG) ; } public static function getInstance( ):ExpressInstall { return _oInstance; } /** * Personnalise le menu contextuel * * @see * @param * @return */ public function init(sPlayerVersion:String, sRequiredVersion : String, mc : MovieClip) : Boolean { // votre code... } /** * PRIVATE METHOD * @usage * @return */ private function loadUpdater() : void { // votre code... } }
Compléments de l’article
- Implémentation du Pattern Singleton dans les autres langages : Design Pattern Singleton
- Autre méthode d’implémentation du Design Pattern Singleton en AS3 : bases-as3.fr. Cette méthode est plus utilisée, c’est d’ailleurs celle que j’utilisais lors de mes débuts en programmation ActionScript.
Articles sur le même sujet :

Oui en effet beaucoup de possibilités mais pour ma part à ta place je ferais une classe simple et ensuite dans un package une simple constante ayant pour type la classe.
/////////
package com.utils
{
public class MyClass {}
}
package com.utils
{
public const singleton:MyClass = new MyClass() ;
}
//////////
Je trouve cela plus élégant
Par exemple pour ton exemple au dessus tu utilises le système de log de VEGAS pour ma part dans mes applications je crée un singleton de type ILogger :
http://code.google.com/p/astr/source/browse/trunk/AS3/trunk/src/astro/logging/logger.as
package astro.logging
{
import vegas.logging.ILogger;
import vegas.logging.Log;
/**
* The logger of the application.
*/
public const logger:ILogger = Log.getLogger( “myApplication”) ;
}
Comme cela plus de soucis pour utiliser des logs partout dans l’application avec ce singleton.
EKA+
Salut Eka,
Merci pour ton conseil judicieux.
Je rajoute cela de suite dans mon framework pour la gestion Singleton du Logger. Tellement simple que je n’y avais pas pensé…
Par contre pour le singleton à partir d’une classe simple et d’une constante du type de la classe, cela n’empêche pas d’instancier directement la classe ?
Ce qui peut être génant dans certains cas, il peut arriver qu’il soit obligatoire de passer par le singleton, et sans pouvoir instancier la classe directement.
Hello
Aucune contrainte
Ta classe reste une classe et la constante c’est juste une instance globale.
Si la classe a un constructeur public pas de problème. Tout dépend de ton code pas de la technique
Pour ma part je trouve inutile de sécuriser les classes au niveau de leur constructeur… le pattern singleton c’est avant tout la centralisation d’une instance unique et globale.
Sinon avec l’IoC (avec VEGAS par exemple) suffit d’utiliser dans la fabrique une définition d’objet singleton d’un objet du type de ta classe et plus besoin de se prendre la tête…
factory.getObject(“mysingleton”)
Plus de méthode getInstance() verbeuse dans les classes et plus de soucis pour tester les classes si on les laisse simple et public (unit test de meilleur qualité)
eKA+