Pattern Singleton en Flash

Flash Ajouter un commentaire

Suite au commentaire de webstorming sur l’article : Flash – Restreindre l’instanciation d’une classe par un seul objet.

Voici l’implémentation du pattern singleton en Flash.

public class PatternSingleton
{
	private static var _instance : Object;
 
	public function PatternSingleton () : void
	{
		if (_instance)
			throw new Error ("Pattern Singleton : only one instance is permit");
		_instance = this;
	}
 
	public function sayHello () : String
	{
		return "Hello World";
	}
 
	public static function get instance () : PatternSingleton
	{
		if (!_instance)
			new PatternSingleton ();
		return PatternSingleton (_instance);
	}
}

Nous avons donc une class ne pouvant être instanciée qu’une seule fois, et accessible de n’importe où au sein de notre application.

trace (PatternSingleton.instance.sayHello ());

Wikipédia

L’implémentation que l’on trouve sur Wikipédia est différente de celle ci-dessus.
En effet, elle utilise la définition d’une constante globale sans modification du constructeur.
Le problème induit, c’est que l’instanciation multiple n’est pas interdite au sein de l’application. Et la compréhension par un débutant est moins aisée.


Vous avez aimé l'article ? Alors vous aimerez surement :
Mots-clefs :, , , , ,

11 réponses to “Pattern Singleton en Flash”

  1. Zed-K Says:

    Sauf erreur de ma part, l’instanciation multiple est impossible avec l’exemple de Wikipedia, puisque la classe SingletonImpl est déclarée internal, donc accessible uniquement à l’intérieur du package « patterns ».

  2. Iteratif Says:

    Salut,

    L’implémentation du Singleton sur WIkipédia n’empêche pas de créer de nouvelles instances mais la démarche est plus longue. Il faut créer une nouvelle constante dans le même package que la classe interne SingletonImpl avec un nom différent, soi:

    package patterns {
        public const MyOtherSingleton:SingletonImpl = new SingletonImpl();
    }

    Mais une petite modification de code peut résoudre le problème :

    package patterns
    {
    	internal class SingletonImpl
    	{
    		private static var instancied:Boolean = false;
    		public function SingletonImpl()
    		{
    			if(instancied)
    				throw new Error ("Pattern Singleton : only one instance is permit");
     
    			instancied = true;
    		}
     
    		public function log(msg:String):void {
    			trace(msg);
    		}
     
    	}
    }

    Et là, plus possible de créer plusieurs instances ;)

  3. Thomas Tourlourat Says:

    @Zed-K, comme le dit Iteratif, il est possible d’instancier plusieurs fois le singleton en modifiant le package… On ne respect donc pas – à la lettre – la définition du pattern.

    @Iteratif, on en revient quasiment à la méthode décrit dans l’article. Il s’agit d’ailleurs de la méthode que l’on retrouve un peu partout sur les forums.

  4. Zed-K Says:

    En effet, au temps pour moi.

    Sinon, la différence entre les 2 méthodes est la façon dont on accède au Singleton. Ce n’est qu’une question de goût, personnellement je préfère y accéder par « Singleton.prop », que je trouve plus concis et lisible que « Singelton.instance.prop ».

    Par contre, cette méthode pose problème si l’on souhaite documenter la classe via AsDoc (j’avais d’ailleurs posé la question à Itératif sur le forum de flexx.fr, si mes souvenirs sont bons).

  5. Thomas Tourlourat Says:

    @Zed-K, la deuxième méthode de permet pas d’utiliser Singleton.prop, ou alors prop doit être une propriété de classe et non d’instance.

    A toi de construire ton Singleton comme tu préfère au niveau de son accès.

  6. Iteratif Says:

    @Thomas, la souplesse d’écriture est intéressante puisqu’il te suffit d’appeler directement les méthodes de l’objet :

    Singleton.log(« toto »);

    Par contre je ne vois pas ou cette implémentation ne respecte pas la définition du pattern : « avoir un objet unique et globale ». Par contre il est clair qu’elle ne respecte pas les implémentations des autres langages mais si je ne me trompe pas, un pattern est le plus souvent indépendant du langage de programmation ;)

  7. Thomas Tourlourat Says:

    @Iteratif, l’accès à Singleton.log ne pourra pas être fait en l’état… Il faut que log soit une fonction de classe et non d’instance. Me trompe-je ?

    Sinon, un pattern est en effet indépendant du langage de programmation. C’est tout l’intérêt du couplage faible en effet ;)

  8. Iteratif Says:

    @Thomas, et bien si, voici a nouveau tout le code :

    //La classe interne
    package patterns
    {
    	internal class SingletonImpl
    	{
    		private static var instancied:Boolean = false;
    		public function SingletonImpl()
    		{
    			if(instancied)
    				throw new Error ("Pattern Singleton : only one instance is permit");
     
    			instancied = true;
    		}
     
    		public function log(msg:String):void {
    			trace(msg);
    		}
     
    	}
    }

    Et la constante Singleton de type SingletonImpl :

    package patterns {
    	public const Singleton:SingletonImpl = new SingletonImpl();
    }

    Voici un article à lire concernant le Singleton : http://steve.yegge.googlepages.com/singleton-considered-stupid

  9. Thomas Tourlourat Says:

    Ah ui, tout à fait Thierry !
    Erreur de ma part pour la lecture, je n’ai pas correctement lu le code, je me suis arrêté aux conventions de nommage.
    Où un mot qui commence par une majuscule est une classe, et une constante est écrite entièrement en majuscule.

  10. Iteratif Says:

    La notation avec une première majuscule est volontaire pour donner l’illusion d’utiliser une référence de classe.

  11. Thomas Tourlourat Says:

    Complètement, et ca je ne l’ai vu que trop tard ^^.

Ajouter une réponse

Designed by NattyWP Wordpress Themes.
Images by desEXign.