Sfat rapid Modelul Singleton

De două ori pe lună, revizuim câteva postări preferate ale cititorilor noștri de-a lungul istoriei Activetuts +. Sfaturile rapide din această săptămână, publicate pentru prima dată în iunie 2010, reprezintă o introducere la un model de design popular.

În acest sfat rapid vom vorbi despre modelul de design Singleton și cum vă poate ajuta să vă optimizați codul atunci când aveți nevoie exact de o instanță a unei clase.


Pasul 1: Introducere

În calitate de programator, trebuie să fiți conștient de faptul că există câteva cazuri în care doriți să utilizați o instanță a unei clase, dar doriți să creați una și să o păstrați pe tot parcursul programului. Ei bine, pentru asta sunt pentru Singletons.


Pasul 2: Ce este un Singleton??

Un Singleton este un model de design orientat pe obiecte folosit de mai mulți programatori; vă permite să creați un fel de instanță "globală" a unei clase. Acesta este creat astfel încât să existe o singură instanță unică, astfel încât toate instanțele acelei clase să fie în exact aceeași stare.


Pasul 3: De ce l-am folosi?

Cel mai frecvent exemplu ar fi un scor - de exemplu un scor de fotbal. Ai avea a Scor clasă, cu proprietăți homeTeamScore și awayTeamScore și o metodă asemănătoare increaseScore (Echipa: Team).

Ambele echipe trebuie să aibă posibilitatea să-și mărească scorul când fac un gol, dar nu puteți da fiecărei echipe propria instanță a Scorului; doriți să accesați și să modificați aceeași.

Acesta este un caz în care un Singleton este o soluție perfectă, deoarece ar putea funcționa ca o instanță globală pe care oricine poate accesa; veți avea doar o instanță pentru toată lumea, deci nu trebuie să vă faceți griji că fiecare echipă va modifica un scor diferit.


Pasul 4: Clasa Singleton

Acum, să începem să creăm un singleton în AS3, dar mai întâi să ne amintim elementele cheie ale unui singleton:

  • Oricine trebuie să aibă acces la acesta.
  • Doar unu poate fi creată.

Creați o nouă clasă AS3 și apelați-o Singleton.as.

(Nu este familiarizat cu codarea bazată pe clasă? Consultați acest intro rapid.)

Iată codul de bază Singleton:

 pachet public class Singleton privat static var instanță: Singleton; // Aceasta va fi instanța unică creată de clasa privată static var isOkayToCreate: Boolean = false; // Această variabilă ne va ajuta să determinăm dacă instanța poate fi creată funcția publică Singleton () // Dacă nu putem crea o instanță, aruncăm o eroare, astfel încât nu se creează nicio instanță dacă (! IsOkayToCreate) aruncă o nouă eroare + "este un Singleton. Acces folosind getInstance ()");  // Cu această metodă vom crea și accesa instanța metodei publice statice method getInstance (): Singleton // Dacă nu există nici o instanță, creați-o dacă (! Instance) // Permite crearea instanței și după ce a fost creat, nu mai mai fi creat isOkayToCreate = true; exemplu = New Singleton (); isOkayToCreate = false; urmări ("Crearea instanței Singleton!");  retur; 

Pasul 5: Creați un proiect Flash

Acum, să mergem și să testați Singleton, mai întâi să creați un nou fișier Flash numit Main.fla. Pe panoul de proprietăți setează clasa de asemenea la Principal.


Pasul 6: Creați un Singleton

Creați o nouă clasă numită "Main" și creați o instanță a Singleton folosind constructorul:

 pachet import flash.display.MovieClip; clasa publică Extensie principală MovieClip funcția publică principală () var testSingleton: Singleton = new Singleton (); 

Salvați și rulați-l, veți vedea că aruncă o eroare care ne spune să folosim funcția getInstance (), deci mergeți mai departe și faceți acest lucru:

 pachet import flash.display.MovieClip; clasa publică Extensie principală MovieClip funcția publică principală () var testSingleton: Singleton = Singleton.getInstance (); 

Salvați și executați-l, nu există nici o eroare acum, și puteți vedea în consolă textul "instanță Singleton create!", Ceea ce înseamnă că a fost creat cu succes.

Atunci când folosiți o clasă Singleton, nu puteți folosi new Singleton (), trebuie să utilizați Singleton.getInstance () in schimb.


Pasul 7: Adăugați proprietăți la clasă

Singleton nu este foarte util în momentul de față. Să adăugăm o proprietate:

 pachet public class Singleton privat static var instanță: Singleton; // Aceasta va fi instanța unică creată de clasa privată static var isOkayToCreate: Boolean = false; // Această variabilă ne va ajuta să determinăm dacă instanța poate fi creată // new example property: public var exampleProperty: String = "Acesta este un exemplu"; funcția publică Singleton () // Dacă nu putem crea o instanță, aruncă o eroare, astfel încât să nu fie creată nicio instanță dacă (! isOkayToCreate) aruncă o nouă eroare (acest + "este un Singleton.Access using getInstance ()");  // Cu această metodă vom crea și accesa instanța metodei publice statice method getInstance (): Singleton // Dacă nu există nici o instanță, creați-o dacă (! Instance) // Permite crearea instanței și după ce a fost creat, nu mai mai fi creat isOkayToCreate = true; exemplu = New Singleton (); isOkayToCreate = false; urmări ("Crearea instanței Singleton!");  retur; 

Acum in Main.as, puteți accesa testSingleton.exampleProperty ca și cum ar fi fost o clasă normală. Încearcă să o urmărești.


Pasul 8: Încercați să creați un alt Singleton

Pentru a dovedi că Singleton face ceea ce trebuie să facă, creați un alt singleton și schimbați proprietatea exemplu a unuia dintre ei:

 pachet import flash.display.MovieClip; clasa publică Extensie principală MovieClip funcția publică principală () var testSingleton: Singleton = Singleton.getInstance (); var altSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Acesta este setat în altSingleton"; urmăriți (testSingleton.exampleProperty, anotherSingleton.exampleProperty); 

Ce crezi ca se va intampla?

Acest lucru chiar funcționează dacă creați variabilele Singleton în diferite clase.


Concluzie

Modelul singleton poate fi folosit pe orice cod și îmi recomand foarte mult dacă intenționați să utilizați doar o instanță a unei clase, deoarece vă oferă un control mai bun asupra acesteia. Sper că ți-a plăcut acest sfat rapid, mulțumesc pentru lectură!

Saludos -Eduardo

Cod