Implémentation du Design Pattern Singleton en AS3.
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.
Prenons le cas d'une application de messagerie, nous pouvons imaginer qu'elle devra gérer un carnet d'adresses et que ce carnet devra être unique. L'application devra faire appel au carnet d'adresses depuis la fenêtre d'un nouveau message mais aussi depuis la fenêtre de gestion de ce même carnet.
Nous devons donc nous assurer qu'à chaque appel du carnet d'adresses, une seule et même instance soit utilisée.
Définition
Le Singleton est mis en œuvre en écrivant une classe contenant une méthode statique qui crée une instance uniquement s'il n'en 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
Comme nous ne pouvons pas utiliser un constructeur privé, nous allons utiliser le principe des classes internes. Dans un fichier .as, il est possible de créer des classes en dehors d'un package. Ces classes internes ne sont accessibles qu'à partir du fichier.
-
package fr.as3.bases.tutorials
-
{
-
public class AdressBook
-
{
-
public function AdressBook()
-
{
-
}
-
-
}
-
}
-
internal class PrivateClass{}
Nous allons ensuite définir un paramètre de type PrivateClass au constructeur de notre classe AdressBook. De ce fait, une erreur sera renvoyée si nous essayons d'instancier notre classe en lui passant en paramètre une instance de la classe PrivateClass car cette classe n'est pas accessible en dehors du fichier AdressBook.as. Je vous laisse réaliser le test pour visualiser l'erreur. Cependant, l'erreur ne sera pas renvoyée si nous passons la valeur null en tant que paramètre d'où le test à l'intérieur du constructeur.
-
package fr.as3.bases.tutorials
-
{
-
public class AdressBook
-
{
-
public function AdressBook(pvt:PrivateClass)
-
{
-
if(pvt == null)
-
{
-
throw new Error("Error: Instantiation failed: Use AdressBook.getInstance() instead of new.");
-
}
-
}
-
-
}
-
}
-
internal class PrivateClass{}
Nous allons maintenant créer la méthode statique, généralement appellée getInstance(), de notre classe qui crée une instance uniquement s'il n'en existe pas encore ou qui renvoie une référence vers l'objet qui existe déjà. Cette méthode utilisera un attribut statique et public, nommé _instance, du type de la classe.
-
package fr.as3.bases.tutorials
-
{
-
public class AdressBook
-
{
-
private static var _instance:AdressBook;
-
-
public function AdressBook(pvt:PrivateClass)
-
{
-
if(pvt == null)
-
{
-
throw new Error("Error: Instantiation failed: Use AdressBook.getInstance() instead of new.");
-
}
-
}
-
-
public static function getInstance():AdressBook
-
{
-
if(_instance == null) _instance = new AdressBook(new PrivateClass());
-
return _instance;
-
}
-
-
}
-
}
-
internal class PrivateClass{}
Ainsi lorsque nous souhaiterons utiliser notre carnet d'adresses dans notre application, nous utiliserons la méthode getInstance() pour récupérer l'objet unique du type AdressBook.
-
import fr.as3.bases.tutorials.AdressBook;
-
private var adressBook:AdressBook = AdressBook.getInstance();






#1 by Matthieu on 1 mai 2009 - 17:02
Bonjour,
Intéressante ta façon d'implémenter le design pattern singleton en AS3. Après avoir des recherches sur google, je préfère utiliser une autre méthode que j'explique ici : http://www.delfiweb.com/as3-implementation-pattern-singleton/article121413.html
#2 by coolman on 26 juin 2009 - 18:05
c tros chouet
#3 by SunriZe on 23 février 2010 - 15:35
Salut je ressort le poste de la poussière lol!
Je suis entrain de me mettre au flex et j'ai besoins de créer un singleton.
J'ai donc utiliser ton mini-tuto ! les variables que j'ai besoins de créer je doit les mettre ou? dans le constructeur de PrivateClass? parce que la Flex Builder me fou une erreur a chaque fois et j'ai beau bidouiller ... sa fonctionne pas!
Merci d'avance
#4 by Tannoy on 25 février 2010 - 22:38
Salut SunriZe
Peux-tu nous donner plus de précisions sur ton problème ?