Rask Tips Singleton Mønster

To ganger i måneden besøker vi noen av våre leseres favorittinnlegg fra hele historien til Activetuts +. Denne ukens retroaktive hurtigspissen, som ble publisert i juni 2010, er en introduksjon til et populært (men ofte misbrukt) designmønster.

I denne Quick Tip skal vi snakke om Singleton designmønsteret og hvordan det kan hjelpe deg med å optimalisere koden din når du trenger nøyaktig en forekomst av en klasse.


Trinn 1: Introduksjon

Som programmerer må du være oppmerksom på at det er noen tilfeller der du vil bruke en forekomst av en klasse, men du vil bare opprette en og holde den gjennom hele programmet. Vel, det er det Singletons er for.


Trinn 2: Hva er en Singleton?

En Singleton er et objektorientert designmønster som brukes av mange programmerere; det lar deg lage en slags "global" forekomst av en klasse. Den er opprettet på en slik måte at bare en unik forekomst kan eksistere, slik at alle forekomster av den klassen er i nøyaktig samme tilstand.


Trinn 3: Hvorfor skulle vi bruke den?

Det vanligste eksempelet vil være en poengsum - for eksempel en fotballscore. Du ville ha en Score klasse, med egenskaper homeTeamScore og awayTeamScore og en metode som increaseScore (team: Team).

Begge lagene må kunne øke sin poengsum når de gjør et mål, men du kan ikke gi hvert lag sin egen Score-forekomst; du vil ha både tilgang til og endre det samme.

Dette er et tilfelle der en Singleton er en perfekt løsning, siden det kan fungere som en global instans som noen kan få tilgang til; Du vil bare ha en forekomst for alle, så du trenger ikke å bekymre deg for at hvert lag vil endre en annen score.


Trinn 4: Singleton Class

La oss nå begynne å lage en singleton i AS3, men husk først hovedelementene i en singleton:

  • Hvem som helst må ha tilgang til den.
  • Bare en forekomst kan opprettes.

Opprett en ny AS3-klasse og ring den Singleton.as.

(Ikke kjent med klassebasert koding? Sjekk ut denne raske introen.)

Her er den grunnleggende Singleton-koden:

 pakke offentlig klasse Singleton privat statlig var eksempel: Singleton; // Dette vil være den unike forekomsten som er opprettet av klassen privat statisk var isOkayToCreate: Boolean = false; // Denne variabelen vil hjelpe oss med å avgjøre om forekomsten kan opprettes offentlig funksjon Singleton () // Hvis vi ikke kan opprette en forekomst, kaste en feil, slik at ingen forekomst opprettes hvis (! IsOkayToCreate) kaster ny feil (dette + "er en Singleton. Tilgang ved hjelp av getInstance ()");  // Med denne metoden vil vi opprette og få tilgang til forekomsten av metoden offentlig statisk funksjon getInstance (): Singleton // Hvis det ikke er tilfelle, opprett det hvis (! Forekomst) // Tillat etableringen av forekomsten, og Etter at den er opprettet, må du stoppe noe mer fra å bli opprettet isOkayToCreate = true; forekomst = ny Singleton (); isOkayToCreate = false; spor ("Singleton instans opprettet!");  returneringsinstans; 

Trinn 5: Opprett et Flash-prosjekt

La oss nå gå og teste Singleton, først opprett en ny Flash-fil med navnet Main.fla. På eiendomspanelet satt klassen også til Hoved.


Trinn 6: Lag en Singleton

Opprett en ny klasse med navnet "Main" og opprett en forekomst av Singleton ved hjelp av konstruktøren:

 pakke import flash.display.MovieClip; offentlig klasse Main utvider MovieClip offentlig funksjon Main () var testSingleton: Singleton = new Singleton (); 

Lagre og kjør det, du vil se at det kaster en feil som forteller oss å bruke getInstance () -funksjonen i stedet, så fortsett å gjøre det:

 pakke import flash.display.MovieClip; offentlig klasse Main utvider MovieClip offentlig funksjon Main () var testSingleton: Singleton = Singleton.getInstance (); 

Lagre og kjør det, det er ingen feil nå, og du kan se i konsollen teksten "Singleton-forekomst opprettet!", Noe som betyr at den ble opprettet.

Så når du bruker en Singleton-klasse, kan du ikke bruke ny singleton (), du må bruke Singleton.getInstance () i stedet.


Trinn 7: Legg til egenskaper i klassen

Singleton er ikke veldig nyttig i minuttet. La oss legge til en eiendom:

 pakke offentlig klasse Singleton privat statlig var eksempel: Singleton; // Dette vil være den unike forekomsten som er opprettet av klassen privat statisk var isOkayToCreate: Boolean = false; // Denne variabelen vil hjelpe oss med å avgjøre om forekomsten kan opprettes // nytt eksempelegenskap: offentlig var exampleProperty: String = "Dette er et eksempel"; offentlig funksjon Singleton () // Hvis vi ikke kan opprette en forekomst, kaste en feil, slik at ingen forekomst opprettes hvis (! isOkayToCreate) kaster ny feil (denne + "er en Singleton. Access ved hjelp av getInstance ()");  // Med denne metoden vil vi opprette og få tilgang til forekomsten av metoden offentlig statisk funksjon getInstance (): Singleton // Hvis det ikke er tilfelle, opprett det hvis (! Forekomst) // Tillat etableringen av forekomsten, og Etter at den er opprettet, må du stoppe noe mer fra å bli opprettet isOkayToCreate = true; forekomst = ny Singleton (); isOkayToCreate = false; spor ("Singleton instans opprettet!");  returneringsinstans; 

Nå i Main.as, du kan få tilgang testSingleton.exampleProperty akkurat som om det var en normal klasse. Prøv å spore det ut.


Trinn 8: Prøv å opprette en annen Singleton

For å bevise at Singleton gjør hva den skal gjøre, skaper du en annen singleton og endrer eksempelegenskapen til en av dem:

 pakke import flash.display.MovieClip; offentlig klasse Main utvider MovieClip offentlig funksjon Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Dette er angitt i en annenSingleton"; spor (testSingleton.exampleProperty, anotherSingleton.exampleProperty); 

Hva tror du vil skje?

Dette fungerer selv om du lager Singleton-variablene i forskjellige klasser.


Konklusjon

Singleton-mønsteret kan brukes på en hvilken som helst kode, og jeg anbefaler det på det sterkeste hvis du skal bruke bare en forekomst av en klasse siden det gir deg bedre kontroll over det. Jeg håper du likte denne Quick Tip, takk for å lese!

Saludos -Eduardo