Sujets sur : singleton
Cours ActionScript 3 ‘singleton’
Utiliser n’importe quelle classe ActionScript comme un Singleton
Commentaires fermés sur Utiliser n’importe quelle classe ActionScript comme un Singleton

Vous connaissez sûrement le Pattern Singleton, un des tout premiers que l’on découvre.
Suivant le projet flash sur lequel vous travaillez, il est possible que vous ayez besoin de transformer une de vos classes en Singleton.
Toutefois, vous ne voulez pas modifier le code source de la classe, pour conserver l’architecture de votre Framework AS3.
J’ai déniché une petite classe utilitaire qui permet de “transformer” n’importe quelle classe ActionScript en Singleton.
Par exemple, dans une application flash quelconque, vous souhaitez toujours utiliser la même instance de l’objet Point, ou une seule instance TextField. Et cela, sans utiliser de variable pour stocker cette référence.
La classe net.richardlord.utils.Singleton.as s’assure qu’une seule instance de la classe, spécifiée en paramètre, existe dans toute l’application flash.
Cette classe Singleton utilise la classe Dictionary qui permet d’associer une clé à une valeur.
En l’occurrence, la clé correspond au nom de la classe, et la valeur contient l’instance de la classe.
Le gros intérêt de cette classe est de permettre de limiter à une instance unique n’importe quelle classe ActionScript, sans modifier son code !
Exemple Singleton Classes
Et voici un exemple est plus parlant.
Il s’agit de créer un objet TextField, sans sauvegarder son instance dans une variable de classe.
Puis plus loin dans une fonction de la classe, nous modifions le contenu du TextField, en utilisant la classe singleton.
[codesyntax lang= »actionscript3″ title= »exemple Singleton Classes » bookmarkname= »exemple Singleton Classes »]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | /** The Initial Developer of the Original Code is Matthieu - https://www.actionscript-facile.com Portions created by the Initial Developer are Copyright (C) 2010 the Initial Developer. All Rights Reserved. Contributor(s) : */ package { import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import net.richardlord.utils.Singleton; import flash.text.TextField; import flash.events.Event; import flash.display.Sprite; import com.demonsters.debugger.MonsterDebugger; public class Main extends Sprite { /** * Constructeur. * */ public function Main() { // attend la fin de l'initialisation de la scène this.addEventListener(Event.ADDED_TO_STAGE, onReady, false, 0, true); } /** * Démarrage de l'application. * définit le nombre d'images par secondes dans les paramètres de compilation * -default-frame-rate 40 * */ private function onReady(event : Event) : void { this.removeEventListener(Event.ADDED_TO_STAGE, onReady); // Init De MonsterDebugger MonsterDebugger.initialize(this); MonsterDebugger.trace(this, "Start Application"); this.addText(); var txtField:TextField = Singleton( TextField ); this.addChild(txtField); this.updateText("Mise à jour du champ texte avec la classe Singleton !"); } /** * Création d'un champ texte. * */ private function addText() : void { var txtField:TextField = Singleton( TextField ); txtField.text = "Texte d'initilisation..."; txtField.autoSize = TextFieldAutoSize.LEFT; txtField.textColor = 0x006f77; txtField.selectable = false; txtField.x = 33; txtField.y = 163; // définit le format par défaut du texte var format : TextFormat = new TextFormat(); format.size = 21; format.font = "Arial"; txtField.defaultTextFormat = format; } /** * Mise à jour du champ texte * en utilisant la classe singleton * */ private function updateText(sValue:String) : void { var txtField:TextField = Singleton( TextField ); txtField.text = sValue; } } } |
[/codesyntax]
[codesyntax lang= »actionscript3″ title= »Singleton » bookmarkname= »Singleton »]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /* * Author: Richard Lord * Copyright (c) Richard Lord 2007 * http://www.richardlord.net/blog/singleton-factory * * Licence Agreement (The MIT License) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package net.richardlord.utils { /** * Returns the same instance of a class every time. If necessary, it creates an instance. * * Usage - * var a:SomeClass = singleton( SomeClass ); */ public function Singleton( type : Class ) : * { return type in instances ? instances[type] : instances[type] = new type(); } } import flash.utils.Dictionary; var instances : Dictionary = new Dictionary( false ); |
[/codesyntax]
SWF Démonstration Singleton Classes
Et voici le swf basique pour illustrer l’utilisation de cette classe Singleton.
1 | http://e6msyji6epr.exactdn.com/wp-content/uploads/2012/02/singleton-classes.swf |
Télécharger le code source Singleton
Visiter le site de l’auteur : Richard Lord
Télécharger “Singleton Classes” ex-singleton-classes.zip – Téléchargé 539 fois – 75,00 KoUtilisez-vous des classes utilitaires pour vous simplifier la programmation ActionScript ?
Partagez-les avec les Développeurs AS3 Facile, via les commentaires ci-dessous.
Comment créer un Singleton en AS3 ?
Dans ce tutoriel, nous allons implémenter le design pattern (ou modèle de conception) Singleton en ActionScript 3.
Et voici le résultat obtenu dans un swf :
1 | http://e6msyji6epr.exactdn.com/wp-content/uploads/2011/03/singleton-ex.swf |
Téléchargez le code source complet de l’exemple :
Télécharger “Implémentation Design Pattern Singleton” singleton-ex.zip – Téléchargé 699 fois – 25,18 KoEt vous, comment implémentez-vous le pattern Singleton en AS3 ?
Il y a, bien évidemment, plusieurs solution pour créer une classe Singleton en ActionScript 3.
Postez votre code AS3 dans les commentaires, je suis curieux de voir votre code.
[codesyntax lang= »actionscript3″ title= »Pattern Singleton » bookmarkname= »Pattern Singleton »]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package { import nl.demonsters.debugger.MonsterDebugger; /** * Classe générique de configuration d'une application * */ public class Config { private static var _oInstance : Config = null;// contient l'instance unique de la classe private static var allowInstance:Boolean = false; // empêche l'instanciation de la classe à partir du constructeur /* paramètres de notre classe de Configuration */ public var texte:String; /** * Returns singleton instance of <code>Config</code> class. * * @return The singleton instance of <code>Config</code> class. */ public static function getInstance() : Config { // si l'instance n'existe pas, on la crée if ( !(Config._oInstance is Config) ) { allowInstance = true;// autorise la création d'une instance Config._oInstance = new Config(); allowInstance = false;// désactive la création d'autre instance } // renvoie toujours la même instance de la classe return Config._oInstance; } /** * Constructeur */ public function Config() : void { if (!allowInstance)// test s'il est possible d'instancier la classe { MonsterDebugger.trace(this, 'This class cannot be instantiated from the constructor' ); // throw new Error ('This class cannot be instantiated from the constructor'); } else // initialisation des paramètres de l'objet Config texte = "Bienvenue sur ActionScript-Facile"; } } } |
[/codesyntax]