2009-08-21 9 views
6

ich einen Zweifel haben, .... Wie würden Sie eine Singleton-Klasse in Flex erstellen ...Singleton Klasse in Flex

Gibt es eine Konvention wie der Klassenname sollte eb Singleton oder es sollte eine andere Klasse erweitern .

Wie viele Singleton-Klassen kann ein Projekt haben?

Kann jemand die Echtzeitnutzung einer Singleton-Klasse sagen?

Ich plane, meine Komponenten Etikettentexte in einer Singleton-Klasse zu halten ... Ist es ein guter Ansatz.

Antwort

17

Kann von Würmern fragen über Singletons!

Es gibt einige verschiedene Möglichkeiten zum Erstellen von Singletons, hauptsächlich weil AS3 keine privaten Konstruktoren hat. Hier ist das Muster, das wir verwenden.

Beachten Sie, dass die SingletonEnforcer-Klasse intern ist und daher nur von der Blah-Klasse (effektiv) verwendet werden kann. Niemand kann die Klasse direkt instanziieren, sie müssen die Funktion getInstance() durchlaufen.

0

Zuerst können Sie auf eine vorherige question verweisen, um herauszufinden, wie eine Singleton-Klasse erstellt wird. Sie können mehr Informationen von einem Yakov Fain presentation auch finden.

Zweite Frage, Ihr Projekt kann Technologie als Singleton-Klasse haben, wie Sie sehen, aber es wird nur 1 Instanz von jedem erstellen. Zum Beispiel haben Sie in der Cairngorm-Architektur 3 Haupt-Singletons: Controller, Service und Modell. Die Anzahl der tatsächlichen Klassen kann sehr von Ihrem Projekt abhängen.

Schließlich wäre eine echte Welt Lösungen. Sie haben zwei Komponenten, die miteinander kommunizieren müssen, aber Sie möchten nicht, dass sie wissen, dass die anderen existieren. Das bedeutet manchmal, dass die Komponenten vorhanden sind und manchmal nicht ... also müssen sie lose gekoppelt sein. Sie können Singletons verwenden, um die Daten von einer Komponente zur anderen zu übertragen, ohne direkt mit ihnen "zu reden".

Die Verwendung von Singletons ist ein guter Ansatz, wenn Sie Daten um Ihre Anwendung von Komponente zu Komponente übertragen müssen und diese voneinander trennen möchten.

+0

Kann ich so etwas wie dies nennen .. \t <[CDATA [ \t \t Import com.invoicetracking.includes.MyValues!; \t]]> \t Kevin

+0

Wobei MyValues ​​eine Singleton-Klasse und addUser eine Variable ist. – Kevin

+0

sicher kann. stellen Sie einfach sicher, dass Sie den [Bindable] Metatag hinzufügen – Shua

2

Hoffnung schlagen Ich bin nicht hier ansehen tote Pferde :)

(edit: ahh, ich wiederhole nur phils Link)

Gregors Singletons Implementierung schützt nicht vor den Konstruktor mit einem Nullwert aufrufen, wie in:

var b:Blah = new Blah(null); 

Sie sti Ich habe nur 1 Instanz, aber das Aufrufen des Konstruktors ist immer noch möglich mit den folgenden Konsequenzen.

Wenn Sie den Singleton unbedingt erzwingen müssen, sollte der Konstruktor sicherstellen, dass der Enforcer-Parameter nicht null ist.

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

Sie sollten auch beim Laden von SWF-Dateien über ApplicationDomain besorgt sein.Externe SWF-Dateien, die die gleichen Definitionen verwenden, können mehrere Singleton-Instanzen haben (1 in jeder separaten Anwendungsdomäne), wenn Sie nicht angeben, dass die SWF-Datei in die vorhandene Anwendungsdomäne geladen werden muss.

Dies bedeutet, dass Blah.getInstance() in AAA.swf nicht dieselbe Instanz wie Blah.getinstance() in BBB.swf ist, wenn AAA.swf BBB.swf ohne eine LoaderContext-Instanz lädt, die das Plugin anweist, zu laden BBB.swf in die gleiche ApplicationDomain wie AAA.swf

+0

Leider funktioniert Ihr Vorschlag nicht, wenn Sie den Super() im contructor coz aufrufen müssen, weil Ihr Singleton von einer anderen Klasse erbt. – 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; 
     } 

    } 
} 

Beachten Sie das Fehlen eines Konstruktors hier.