Två gånger i månaden besöker vi några av våra läsares favoritinlägg från hela Activetuts + historia. Den här veckans retroaktiva Quick Tip, som publicerades första gången i juni 2010, är en introduktion till ett populärt (men vanligtvis missbrukat) designmönster.
I denna Snabba Tips ska vi prata om Singleton-mönstret och hur det kan hjälpa dig att optimera din kod när du behöver exakt en instans av en klass.
Som programmerare måste du vara medveten om att det finns några fall där du vill använda en förekomst av en klass, men du vill bara skapa en och behålla den genom hela programmet. Tja, det är vad Singletons är för.
En Singleton är ett objektorienterat designmönster som används av många programmerare; det låter dig skapa en slags "global" instans av en klass. Den är skapad på ett sådant sätt att endast en unik förekomst kan existera, så att alla instanser av den klassen är i exakt samma tillstånd.
Det vanligaste exemplet skulle vara ett poäng - till exempel en fotbollscore. Du skulle ha en Göra klass, med egenskaper homeTeamScore och awayTeamScore och en metod som increaseScore (lag: Team).
Båda lagen måste kunna öka sin poäng när de gör ett mål, men du kan inte ge varje lag sin egen poänginstans. du vill ha både tillgång till och ändra samma.
Det här är ett fall där en Singleton är en perfekt lösning, eftersom den kan fungera som en global instans som någon kan komma åt. du kommer att ha bara en förekomst för alla, så du behöver inte oroa dig för att varje lag kommer att ändra ett annat poäng.
Låt oss nu börja skapa en singleton i AS3, men först kom ihåg de viktigaste elementen i en singleton:
Skapa en ny AS3-klass och ring den Singleton.as.
(Inte bekant med klassbaserad kodning? Kolla in denna snabba intro.)
Här är den grundläggande Singleton-koden:
paket offentlig klass Singleton privat statlig var exempel: Singleton; // Detta blir den unika instansen skapad av klassen privat statisk var isOkayToCreate: Boolean = false; // Denna variabel hjälper oss att bestämma huruvida förekomsten kan skapas offentlig funktion Singleton () // Om vi inte kan skapa en instans, kasta ett fel så att ingen förekomst skapas om (! IsOkayToCreate) kasta nytt fel (detta + "är en Singleton. Åtkomst med getInstance ()"); // Med den här metoden kommer vi att skapa och komma åt metoden av metoden offentliga statiska funktionen getInstance (): Singleton // Om det inte finns någon förekomst, skapa den om (! Instans) // Tillåt skapandet av förekomsten, och När det är skapat, sluta med att bli skapad isOkayToCreate = true; instans = ny Singleton (); isOkayToCreate = false; spår ("Singleton instans skapad!"); returnera instans
Låt oss nu gå och testa Singleton, först skapa en ny Flash-fil med namnet Main.fla. På egenskapspanelen ställer du också klassen till Huvudsaklig.
Skapa en ny klass med namnet "Main" och skapa en instans av Singleton med hjälp av konstruktören:
paket import flash.display.MovieClip; public class Main utökar MovieClip public function Main () var testSingleton: Singleton = new Singleton ();
Spara och kör det, du kommer att se att det slår ett fel som berättar att vi använder funktionen getInstance () istället, så fortsätt och gör det:
paket import flash.display.MovieClip; public class Main utökar MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance ();
Spara och kör det, det finns inget fel nu och du kan se i konsolen texten "Singleton instans skapad!", Vilket innebär att den skapades.
Så när du använder en Singleton-klass kan du inte använda ny singleton (), du måste använda Singleton.getInstance () istället.
Singleton är inte särskilt användbar i minuten. Låt oss lägga till en fastighet:
paket offentlig klass Singleton privat statlig var exempel: Singleton; // Detta blir den unika instansen skapad av klassen privat statisk var isOkayToCreate: Boolean = false; // Denna variabel hjälper oss att bestämma om förekomsten kan skapas // nytt exempel egendom: public var exampleProperty: String = "Detta är ett exempel"; public function Singleton () // Om vi inte kan skapa en instans, kasta ett fel så att ingen förekomst skapas om (! isOkayToCreate) kasta nytt fel (detta + "är en Singleton. Access med getInstance ()"); // Med den här metoden kommer vi att skapa och komma åt metoden av metoden offentliga statiska funktionen getInstance (): Singleton // Om det inte finns någon förekomst, skapa den om (! Instans) // Tillåt skapandet av förekomsten, och När det är skapat, sluta med att bli skapad isOkayToCreate = true; instans = ny Singleton (); isOkayToCreate = false; spår ("Singleton instans skapad!"); returnera instans
Nu inne Main.as, du kan komma åt testSingleton.exampleProperty precis som om det var en normal klass. Prova att spåra det.
För att bevisa att Singleton gör vad den ska göra, skapa en annan singleton och ändra exemplaregenskapen hos en av dem:
paket import flash.display.MovieClip; public class Main utökar MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Detta är inställt i en annanSingleton"; spår (testSingleton.exampleProperty, anotherSingleton.exampleProperty);
Vad tror du kommer hända?
Detta fungerar även om du skapar Singleton-variablerna i olika klasser.
Singleton-mönstret kan användas på vilken kod som helst, och jag rekommenderar det starkt om du bara använder en instans av en klass eftersom det ger dig bättre kontroll över det. Jag hoppas att du gillade den här snabba tipsen, tack för att du läste!
Saludos -Eduardo