Derniers Commentaires

  • HB: en fait il faut surtout se demander pourquoi on veut proteger une appli, de qui, quelles parties, etc… si...
  • mika: En effet hb, ton message m’a fait réfléchir. Et ce matin sous la douche naquit une idée. Pourquoi ne pas...
  • hb: Hello, pas sur que ce type de blocage soit vraiment une bonne solution… ca s’appelle se faire justice...
  • mika: Merci pour le code ! c’est un bon début de protection. Je me demandais si il était possible...
  • TiBaker-974: Heu… lol ta parfaitement raison Julien c’est pour ça je suis déçus mais bon on pourra...

AS3 Création d’un Singleton

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.
Partagez cet article :
  • Digg
  • del.icio.us
  • Facebook
  • Technorati
  • MySpace
  • LinkedIn
  • Wikio FR
  • Yahoo! Buzz
  • Netvibes
  • Google Bookmarks
  • PDF
  • email
  • Print

Articles sur le même sujet :

  1. Freelance – Protéger votre application flash

3 comments to AS3 Création d’un Singleton

  • 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+ :)

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">