2009-08-21 7 views
6

je doute .... Comment voulez-vous créer une classe Singleton dans Flex ...Singleton dans la classe Flex

Y at-il une convention comme le nom de la classe doivent eb Singleton ou il devrait étendre toute autre classe .

Combien de classes Singleton un projet peut-il avoir? Est-ce que quelqu'un peut dire l'utilisation en temps réel d'une classe Singleton?

Je prévois de garder mes textes d'étiquettes de composants dans une classe Singleton ... Est-ce une bonne approche.

Répondre

17

Can de vers poser des questions sur les singletons!

Il existe plusieurs options différentes concernant la création de singletons principalement parce que AS3 n'a pas de constructeur privé. Voici le modèle que nous utilisons. Notez que la classe SingletonEnforcer est interne et ne peut donc être utilisée que par la classe Blah (efficacement). Personne ne peut directement instancier la classe, ils doivent passer par la fonction getInstance().

0

D'abord, vous pouvez faire référence à un précédent question pour savoir comment créer une classe singleton. Vous pouvez également trouver plus d'informations auprès d'un Yakov Fain presentation.

Deuxième question, votre projet peut avoir la technologie que vous voulez, mais il ne créera qu'une instance de chaque. Par exemple, dans l'architecture cairngorm vous avez 3 singletons principaux: contrôleur, service et modèle. Le nombre de classe réelle peut très dépend de votre projet.

Enfin, une des solutions du monde réel serait. Vous avez deux composants qui ont besoin de se parler mais vous ne voulez pas qu'ils sachent que l'autre existe. Cela signifie parfois que les composants sont là et parfois ils ne le sont pas ... donc vous avez besoin qu'ils soient faiblement couplés. vous pouvez utiliser des singletons pour transmettre les données d'un composant à l'autre sans leur "parler" directement. L'utilisation de singletons est une bonne approche si vous avez besoin de transmettre des données autour de votre application d'un composant à un autre et que vous souhaitez les découpler les uns des autres.

+0

Puis-je appeler quelque chose comme ça .. \t <[CDATA [ \t \t com.invoicetracking.includes.MyValues ​​à l'importation!; \t]]> \t Kevin

+0

Où MyValues ​​est une classe Singleton et addUser est une variable. – Kevin

+0

sure can. Assurez-vous simplement d'ajouter la métabalise [Bindable] – Shua

2

espoir Je ne suis pas frapper les chevaux morts ici :)

(modifier: ahh, je ne fais que répéter lien Phils)

Gregors mise en œuvre singleton ne protège pas contre l'invocation du constructeur avec une valeur nulle, comme dans:

var b:Blah = new Blah(null); 

Vous sti Il n'y aura qu'une seule instance, mais l'invocation du constructeur est toujours possible avec les conséquences qui suivent.

Si vous devez absolument appliquer le singleton, le constructeur doit s'assurer que le paramètre enforcer n'est pas null.

public function Blah(enforcer : SingletonEnforcer) { 
     if(!enforcer){ 
     throw new Error("whoops!"); 
     } 
    } 

Vous devez également vous préoccuper de ApplicationDomain lors du chargement de fichiers swf.Les fichiers swf externes qui utilisent les mêmes définitions peuvent avoir plusieurs instances singleton (1 dans chaque domaine d'application distinct) si vous ne spécifiez pas que le fichier swf doit être chargé dans le domaine d'application existant. Cela signifie que Blah.getInstance() dans AAA.swf n'est pas la même instance que Blah.getinstance() dans BBB.swf, si AAA.swf charge BBB.swf sans une instance LoaderContext qui indique au plugin de se charger BBB.swf dans le même domaine d'application que AAA.swf

+0

Malheureusement votre suggestion ne fonctionnera pas si vous avez besoin d'appeler le super() dans le constructeur car votre singleton hérite d'une autre classe. – MadBlack

0
package com.foo.bar 
{ 
    public class MySingleton 
    { 
     private static var _instance:MySingleton = new MySingleton; 
     private var _myName:String; 

     public static function get instance():MySingleton 
     { 
      return _instance; 
     } 

     public function set myName(value:String):void 
     { 
      _myName = value; 
     } 

     public function get myName():String 
     { 
      return _myName; 
     } 

    } 
} 

Notez l'absence d'un constructeur ici.

Questions connexes