Suggerimento rapido il modello Singleton

Due volte al mese, rivisitiamo alcuni dei post preferiti dei nostri lettori da tutta la storia di Activetuts +. Il suggerimento rapido retroattivo di questa settimana, pubblicato per la prima volta nel giugno 2010, è un'introduzione a un modello di progettazione popolare (ma comunemente usato male).

In questo suggerimento rapido parleremo del modello di progettazione di Singleton e di come può aiutarti a ottimizzare il codice quando hai bisogno esattamente di un'istanza di una classe.


Step 1: Introduzione

Come programmatore devi essere consapevole del fatto che ci sono alcuni casi in cui si desidera utilizzare un'istanza di una classe, ma si desidera crearne solo una e tenerla per l'intero programma. Bene, questo è ciò per cui Singletons è.


Passaggio 2: cos'è un Singleton?

Un Singleton è un modello di progettazione orientato agli oggetti utilizzato da molti programmatori; ti consente di creare una sorta di istanza "globale" di una classe. Viene creato in modo che possa esistere un'unica istanza unica, in modo che tutte le istanze di quella classe si trovino esattamente nello stesso stato.


Fase 3: Perché dovremmo usarlo?

L'esempio più comune potrebbe essere un punteggio, ad esempio un punteggio di calcio. Avresti un Punto classe, con proprietà homeTeamScore e awayTeamScore e un metodo come increaseScore (team: Team).

Entrambe le squadre devono essere in grado di aumentare il proprio punteggio quando fanno un goal, ma non si può dare a ciascuna squadra la propria istanza di punteggio; vuoi entrambi accedere e modificare lo stesso.

Questo è un caso in cui un Singleton è una soluzione perfetta, dal momento che potrebbe funzionare come un'istanza globale a cui chiunque può accedere; avrai solo un'istanza per tutti, quindi non devi preoccuparti che ogni squadra modifichi un punteggio diverso.


Passaggio 4: Classe Singleton

Ora iniziamo a creare un singleton in AS3, ma prima ricordiamo gli elementi chiave di un singleton:

  • Chiunque deve essere in grado di accedervi.
  • Appena uno l'istanza può essere creata.

Crea una nuova classe AS3 e chiamala Singleton.as.

(Non hai familiarità con la codifica basata su classi? Dai un'occhiata a questa introduzione rapida.)

Ecco il codice Singleton di base:

 pacchetto public class Singleton istanza privata statica var: Singleton; // Questa sarà l'istanza univoca creata dalla classe static static var isOkayToCreate: Boolean = false; // Questa variabile ci aiuterà a determinare se l'istanza può essere creata funzione pubblica Singleton () // Se non possiamo creare un'istanza, lanciare un errore in modo che non venga creata alcuna istanza se (! IsOkayToCreate) genera un nuovo errore (questo + "è un Singleton, accesso usando getInstance ()");  // Con questo metodo creeremo e accediamo all'istanza del metodo public function getInstance (): Singleton // Se non c'è istanza, creala if (! Instance) // Permetti la creazione dell'istanza, e dopo che è stato creato, fermati ancora dalla creazione isOkayToCreate = true; instance = new Singleton (); isOkayToCreate = false; trace ("Istanza Singleton creata!");  restituisci istanza; 

Passaggio 5: creare un progetto Flash

Ora andiamo a testare Singleton, per prima cosa crea un nuovo file Flash chiamato main.fla. Nel pannello delle proprietà, imposta anche la classe Principale.


Passaggio 6: creare un singleton

Crea una nuova classe chiamata "Principale" e crea un'istanza di Singleton usando il costruttore:

 package import flash.display.MovieClip; public class Main extends MovieClip public function Main () var testSingleton: Singleton = new Singleton (); 

Salvalo ed eseguilo, vedrai che genera un errore che ci dice di usare la funzione getInstance (), quindi procedi e procedi in questo modo:

 package import flash.display.MovieClip; public class Main extends MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance (); 

Salvalo ed eseguilo, non ci sono errori ora, e puoi vedere nella console il testo "Istanza Singleton creata!", Il che significa che è stato creato con successo.

Quindi quando usi una classe Singleton, non puoi usare nuovo Singleton (), devi usare Singleton.getInstance () anziché.


Passaggio 7: aggiungere proprietà alla classe

Il Singleton non è molto utile al minuto. Aggiungiamo una proprietà:

 pacchetto public class Singleton istanza privata statica var: Singleton; // Questa sarà l'istanza univoca creata dalla classe static static var isOkayToCreate: Boolean = false; // Questa variabile ci aiuterà a determinare se l'istanza può essere creata // nuova proprietà di esempio: public var exampleProperty: String = "Questo è un esempio"; funzione pubblica Singleton () // Se non è possibile creare un'istanza, lanciare un errore in modo che non venga creata alcuna istanza se (! isOkayToCreate) genera un nuovo errore (questo + "è un Singleton. Accesso utilizzando getInstance ()");  // Con questo metodo creeremo e accediamo all'istanza del metodo public function getInstance (): Singleton // Se non c'è istanza, creala if (! Instance) // Permetti la creazione dell'istanza, e dopo che è stato creato, fermati ancora dalla creazione isOkayToCreate = true; instance = new Singleton (); isOkayToCreate = false; trace ("Istanza Singleton creata!");  restituisci istanza; 

Ora in Main.as, puoi accedere testSingleton.exampleProperty proprio come se fosse una classe normale. Prova a rintracciarlo.


Passaggio 8: provare a creare un altro singleton

Per provare che Singleton fa ciò che deve fare, crea un altro singleton e modifica la proprietà di esempio di uno di essi:

 package import flash.display.MovieClip; public class Main extends MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Questo è impostato su anotherSingleton"; trace (testSingleton.exampleProperty, anotherSingleton.exampleProperty); 

Cosa pensi che succederà?

Questo funziona anche se si creano le variabili Singleton in classi diverse.


Conclusione

Il modello singleton può essere utilizzato su qualsiasi codice e lo consiglio vivamente se si intende utilizzare solo un'istanza di una classe poiché consente un controllo migliore. Spero che questo Quick Tip ti sia piaciuto, grazie per la lettura!

Saludos-Eduardo