Snelle tip het Singleton-patroon

Twee keer per maand bekijken we enkele van onze favoriete lezers uit de geschiedenis van Activetuts +. De retroactieve Quick Tip van deze week, voor het eerst gepubliceerd in juni 2010, is een inleiding tot een populair (maar vaak verkeerd gebruikt) ontwerppatroon.

In deze Quick Tip gaan we het hebben over het Singleton-ontwerppatroon en hoe het u kan helpen om uw code te optimaliseren wanneer u precies één exemplaar van een klasse nodig heeft.


Stap 1: Introductie

Als programmeur moet je je ervan bewust zijn dat er sommige gevallen zijn waarin je een instantie van een klasse wilt gebruiken, maar dat je er maar één wilt maken en deze gedurende het hele programma wilt behouden. Wel, daar zijn Singletons voor.


Stap 2: Wat is een Singleton?

Een Singleton is een object-georiënteerd ontwerppatroon dat door veel programmeurs wordt gebruikt; hiermee kunt u een soort "globale" instantie van een klasse maken. Het is zo gemaakt dat er maar één uniek exemplaar kan bestaan, zodat alle instanties van die klasse zich in exact dezelfde staat bevinden.


Stap 3: Waarom zouden we het gebruiken?

Het meest voorkomende voorbeeld is een score - bijvoorbeeld een voetbalscore. Je zou een hebben partituur klasse, met eigenschappen homeTeamScore en awayTeamScore en een methode zoals increaseScore (team: Team).

Beide teams moeten hun score kunnen verhogen als ze een doelpunt maken, maar je kunt niet elk team een ​​eigen Score-instantie geven; je wilt dat beide dezelfde openen en wijzigen.

Dit is een geval waarbij een Singleton een perfecte oplossing is, omdat het zou kunnen werken als een wereldwijde instantie waar iedereen toegang toe heeft; je hebt maar één instantie voor iedereen, dus je hoeft je geen zorgen te maken dat elk team een ​​andere score zal aanpassen.


Stap 4: Singleton Class

Laten we nu een singleton maken in AS3, maar onthoud eerst de belangrijkste elementen van een singleton:

  • Iedereen moet toegang hebben.
  • Net een instantie kan worden gemaakt.

Maak een nieuwe AS3-klasse en noem die Singleton.as.

(Niet bekend met op klassen gebaseerde codering? Bekijk deze snelle intro.)

Hier is de standaard Singleton-code:

 package public class Singleton private static var instance: Singleton; // Dit wordt de unieke instantie gemaakt door de klasse private static var isOkayToCreate: Boolean = false; // Deze variabele helpt ons om te bepalen of de instantie kan worden gemaakt openbare functie Singleton () // Als we geen instantie kunnen maken, gooi dan een fout zodat er geen instantie wordt aangemaakt als (! IsOkayToCreate) nieuwe fout gooit (dit + "is een Singleton.Toegang met getInstance ()");  // Met deze methode zullen we het exemplaar van de methode openbare statische functie maken en openen. GetInstance (): Singleton // Als er geen instantie is, maakt u deze aan (! Instantie) // Sta de oprichting van de instantie toe, en nadat het is gemaakt, stop je niet meer om te worden gemaakt isOkayToCreate = true; instantie = nieuwe Singleton (); isOkayToCreate = false; trace ("Singleton instance created!");  return-instantie; 

Stap 5: Maak een Flash-project

Laten we nu de Singleton testen, eerst een nieuw Flash-bestand maken met de naam Main.fla. Stel in het eigenschappenvenster de klasse ook in op Hoofd.


Stap 6: Maak een Singleton

Maak een nieuwe klasse met de naam "Hoofd" en maak een exemplaar van Singleton met behulp van de constructor:

 pakket import flash.display.MovieClip; public class Main breidt MovieClip uit public function Main () var testSingleton: Singleton = new Singleton (); 

Sla op en voer het uit, u zult zien dat het een fout veroorzaakt die ons vertelt om de functie getInstance () te gebruiken, dus ga je gang en doe dat:

 pakket import flash.display.MovieClip; public class Main breidt MovieClip uit public function Main () var testSingleton: Singleton = Singleton.getInstance (); 

Opslaan en uitvoeren, er is nu geen fout en u kunt in de console de tekst "Singleton-instantie gemaakt!" Zien, wat betekent dat deze met succes is gemaakt.

Dus wanneer u een Singleton-klasse gebruikt, kunt u deze niet gebruiken nieuwe Singleton (), je moet gebruiken Singleton.getInstance () in plaats daarvan.


Stap 7: voeg eigenschappen toe aan de klas

De Singleton is op het moment niet erg nuttig. Laten we een eigenschap toevoegen:

 package public class Singleton private static var-instantie: Singleton; // Dit wordt de unieke instantie gemaakt door de klasse private static var isOkayToCreate: Boolean = false; // Deze variabele helpt ons te bepalen of de instantie kan worden gemaakt // nieuwe voorbeeldeigenschap: public var exampleProperty: String = "Dit is een voorbeeld"; openbare functie Singleton () // Als we geen instantie kunnen maken, gooi dan een fout zodat er geen exemplaar wordt aangemaakt als (! isOkayToCreate) nieuwe fout gooit (dit + "is een Singleton.Toegang met getInstance ()");  // Met deze methode zullen we het exemplaar van de methode openbare statische functie maken en openen. GetInstance (): Singleton // Als er geen instantie is, maakt u deze aan (! Instantie) // Sta de oprichting van de instantie toe, en nadat het is gemaakt, stop je niet meer om te worden gemaakt isOkayToCreate = true; instantie = nieuwe Singleton (); isOkayToCreate = false; trace ("Singleton instance created!");  return-instantie; 

Nu in Main.as, je hebt toegang testSingleton.exampleProperty net alsof het een normale klas was. Probeer het te traceren.


Stap 8: Probeer nog een singleton te maken

Om te bewijzen dat de Singleton doet wat het zou moeten doen, moet je nog een singleton maken en de voorbeeldeigenschap van een van hen wijzigen:

 pakket import flash.display.MovieClip; public class Main breidt MovieClip uit public function Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Dit is ingesteld in anotherSingleton"; trace (testSingleton.exampleProperty, anotherSingleton.exampleProperty); 

Wat denk je dat er gaat gebeuren?

Dit werkt zelfs als u de Singleton-variabelen in verschillende klassen maakt.


Conclusie

Het singleton-patroon kan op elke code worden gebruikt en ik beveel het ten zeerste aan als u slechts één exemplaar van een klasse wilt gebruiken, omdat u hiermee meer controle hebt. Ik hoop dat je deze Quick Tip leuk vond, bedankt voor het lezen!

Saludos - Edardo