[AS3] Design Pattern : Singleton
30 janvier 2009 – 10:36Ces derniers temps je n'ai pas eu d'autres choix que de me plonger dans l'étude des "design pattern". Projet complexe, volonté de rester flexible et soucieux de l'élégance, j'ai donc commencé à réfléchir à une classe à laquelle je pourrais accéder de n'importe où et qui contiendrait des propriétés et méthodes que je pourrais avoir besoin en permanence. Quelques discussions plus tard (merci Claude), un bon article et finalement je me tourne vers une solution "alternative".
Alternative car en Actionscript 3 on ne peut pas déclarer de constructeur privé, ce qui dès le départ nous empêche "théoriquement" de respecter le pattern Singleton. Mais comme tout le monde le dit, les "design pattern" sont là pour guider, inspirer et non pas pour imposer une manière de développer.
Parmis les alternatives pour réaliser un Singleton en actionscript 3, il y a la méthode que j'ai trouvé dans le livre "ActionScript 3.0 Design Patterns" des éditions O'Reilly. Excellent livre, très bien expliqué, où l'on peut trouver le moyen de déclarer un constructeur privé (en déclarant un second constructeur en dehors du package) dans une classe. Mais comme le dit Peter Elst "you’re still able to pass null as an argument to the constructor and prevent if from throwing an error".
Alors à quoi bon se casser la tête à coder un "pseudo" Singleton si au final on peut le contourner ?
On perds l'objectif de vue qui est d'empêcher la classe d'être instancié plusieurs fois. Si on a pas de constructeur de privé, il faudra trouver une solution avec un constructeur publique, mais en aucun cas je vais me casser la tête à mettre au point un "pseudo" constructeur privé si de toutes façons l'objectif principale n'est pas respecté...
C'est donc vers la solution de Grant Skinner que je me suis orienté. Simple, propre, lisible, un simple Boolean qui indique si la classe a déjà été instancié ou non. C'est pas un constructeur privé mais ça fait ce qu'on attends d'un Singleton.
Cependant, j'espère quand même que nous aurons bientôt la possibilité de déclarer un constructeur privé dans une classe étant donné que l'argument avancé au départ était le fait qu'actionscript 3 est conforme aux normes ECMAScript (ce dernier n'ayant pas de constructeur privé). Hors depuis peu ce n'est plus le cas, alors pourquoi pas ?
