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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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.
1 | 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.
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”.
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:
Mais une petite modification de code peut résoudre le problème :
Et là, plus possible de créer plusieurs instances 😉
@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.
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).
@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.
@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 😉
@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 😉
@Thomas, et bien si, voici a nouveau tout le code :
Et la constante Singleton de type SingletonImpl :
Voici un article à lire concernant le Singleton : http://steve.yegge.googlepages.com/singleton-considered-stupid
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.
La notation avec une première majuscule est volontaire pour donner l’illusion d’utiliser une référence de classe.
Complètement, et ca je ne l’ai vu que trop tard ^^.