Zweimal im Monat besuchen wir einige der Lieblingsbeiträge unserer Leser aus der gesamten Geschichte von Activetuts +. Der im Juni 2010 erstmals veröffentlichte retro-Active Quick Tip ist eine Einführung in ein beliebtes (jedoch häufig falsch verwendetes) Designmuster.
In diesem Quick Tip werden wir über das Singleton-Entwurfsmuster sprechen und wie Sie dabei helfen können, Ihren Code zu optimieren, wenn Sie genau eine Instanz einer Klasse benötigen.
Als Programmierer müssen Sie sich darüber im Klaren sein, dass es Fälle gibt, in denen Sie eine Instanz einer Klasse verwenden möchten, aber Sie möchten nur eine erstellen und diese im gesamten Programm beibehalten. Nun, dafür sind Singletons.
Ein Singleton ist ein objektorientiertes Designmuster, das von vielen Programmierern verwendet wird. Damit können Sie eine Art "globale" Instanz einer Klasse erstellen. Es wird so erstellt, dass nur eine einzige Instanz vorhanden sein kann, sodass sich alle Instanzen dieser Klasse in genau demselben Zustand befinden.
Das häufigste Beispiel wäre eine Punktzahl - zum Beispiel eine Fußballpunktzahl. Sie hätten eine Ergebnis Klasse mit Eigenschaften homeTeamScore und awayTeamScore und eine Methode wie gainScore (Team: Team).
Beide Teams müssen in der Lage sein, ihre Punktzahl zu erhöhen, wenn sie ein Tor erzielen, aber Sie können nicht jeder Mannschaft eine eigene Score-Instanz zuweisen. Sie möchten auf dasselbe zugreifen und es ändern.
In diesem Fall ist Singleton eine perfekte Lösung, da es als globale Instanz funktionieren könnte, auf die jeder zugreifen kann. Sie haben nur eine Instanz für alle, sodass Sie nicht befürchten müssen, dass jedes Team eine andere Punktzahl ändert.
Beginnen wir nun mit der Erstellung eines Singleton in AS3, aber denken Sie zunächst an die Schlüsselelemente eines Singleton:
Erstellen Sie eine neue AS3-Klasse und rufen Sie sie auf Singleton.as.
(Sie kennen sich nicht mit klassenbasiertem Programmieren aus?
Hier ist der grundlegende Singleton-Code:
package public class Singleton private statische Var-Instanz: Singleton; // Dies ist die eindeutige Instanz, die von der Klasse private static erstellt wird. Var isOkayToCreate: Boolean = false; // Diese Variable hilft uns zu bestimmen, ob die Instanz erstellt werden kann. Public function Singleton () // Wenn keine Instanz erstellt werden kann, wird ein Fehler ausgegeben, sodass keine Instanz erstellt wird, wenn (! IsOkayToCreate) einen neuen Fehler (diese + "ist ein Singleton. Zugriff über getInstance ()"); // Mit dieser Methode erstellen und greifen Sie auf die Instanz der Methode zu. Public static function getInstance (): Singleton // Wenn keine Instanz vorhanden ist, erstellen Sie if (! Instance) // Erlauben Sie die Erstellung der Instanz, und Nachdem es erstellt wurde, kann keine weitere Erstellung erfolgen. isOkayToCreate = true; Instanz = neues Singleton (); isOkayToCreate = false; trace ("Singleton-Instanz erstellt!"); Instanz zurückgeben;
Lassen Sie uns nun den Singleton testen, erstellen Sie zunächst eine neue Flash-Datei mit dem Namen Main.fla. Setzen Sie im Eigenschaftenfenster die Klasse ebenfalls auf Main.
Erstellen Sie eine neue Klasse mit dem Namen "Main" und erstellen Sie eine Instanz von Singleton mit dem Konstruktor:
package import flash.display.MovieClip; public class Main erweitert MovieClip public function Main () var testSingleton: Singleton = new Singleton ();
Speichern Sie es und führen Sie es aus. Sie werden sehen, dass es einen Fehler ausgibt, der uns anweist, stattdessen die Funktion getInstance () zu verwenden. Fahren Sie also fort:
package import flash.display.MovieClip; public class Main erweitert MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance ();
Speichern und führen Sie es aus. Es wird jetzt kein Fehler angezeigt. In der Konsole wird der Text "Singleton-Instanz erstellt!" Angezeigt, der besagt, dass er erfolgreich erstellt wurde.
Wenn Sie also eine Singleton-Klasse verwenden, können Sie sie nicht verwenden neues Singleton (), du musst benutzen Singleton.getInstance () stattdessen.
Das Singleton ist momentan nicht sehr nützlich. Fügen wir eine Eigenschaft hinzu:
package public class Singleton private statische Var-Instanz: Singleton; // Dies ist die eindeutige Instanz, die von der Klasse private static erstellt wird. Var isOkayToCreate: Boolean = false; // Diese Variable hilft uns festzustellen, ob die Instanz erstellt werden kann. // neues Beispiel property: public var exampleProperty: String = "Dies ist ein Beispiel"; public function Singleton () // Wenn keine Instanz erstellt werden kann, werfen Sie einen Fehler, damit keine Instanz erstellt wird, wenn (! isOkayToCreate) neuen Fehler auslöst (dieses + "ist ein Singleton. Zugriff über getInstance ()"); // Mit dieser Methode erstellen und greifen Sie auf die Instanz der Methode zu. Public static function getInstance (): Singleton // Wenn keine Instanz vorhanden ist, erstellen Sie if (! Instance) // Erlauben Sie die Erstellung der Instanz, und Nachdem es erstellt wurde, kann keine weitere Erstellung erfolgen. isOkayToCreate = true; Instanz = neues Singleton (); isOkayToCreate = false; trace ("Singleton-Instanz erstellt!"); Instanz zurückgeben;
Jetzt in Main.as, Sie können darauf zugreifen testSingleton.exampleProperty als wäre es eine normale Klasse. Versuchen Sie es aufzuspüren.
Um zu beweisen, dass das Singleton das tut, was es tun soll, erstellen Sie ein anderes Singleton und ändern Sie die Beispieleigenschaft eines der folgenden:
package import flash.display.MovieClip; public class Main erweitert MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Dies wird in anotherSingleton festgelegt"; trace (testSingleton.exampleProperty, anotherSingleton.exampleProperty);
Was denkst du wird passieren?
Dies funktioniert sogar, wenn Sie die Singleton-Variablen in verschiedenen Klassen erstellen.
Das Singleton-Muster kann für jeden Code verwendet werden. Ich empfehle es sehr, wenn Sie nur eine Instanz einer Klasse verwenden möchten, da Sie damit eine bessere Kontrolle haben. Ich hoffe, Ihnen hat dieser Quick Tip gefallen, vielen Dank für das Lesen!
Saludos-Eduardo