Consejo rápido El patrón Singleton

Dos veces al mes, volvemos a visitar algunas de las publicaciones favoritas de nuestros lectores de toda la historia de Activetuts +. El Consejo rápido retroactivo de esta semana, publicado por primera vez en junio de 2010, es una introducción a un patrón de diseño popular (pero comúnmente mal usado).

En este Consejo rápido, hablaremos sobre el patrón de diseño de Singleton y cómo puede ayudarlo a optimizar su código cuando necesite exactamente una instancia de una clase..


Paso 1: Introducción

Como programador, debe tener en cuenta que hay algunos casos en los que desea utilizar una instancia de una clase, pero desea crear solo una y mantenerla durante todo el programa. Bueno, para eso están los Singletons..


Paso 2: ¿Qué es un Singleton??

Un Singleton es un patrón de diseño orientado a objetos utilizado por muchos programadores; te permite crear una especie de instancia "global" de una clase. Se crea de tal manera que solo puede existir una instancia única, de modo que todas las instancias de esa clase estén exactamente en el mismo estado.


Paso 3: ¿Por qué lo usaríamos??

El ejemplo más común sería una puntuación, por ejemplo, una puntuación de fútbol. Tendrías un Puntuación clase, con propiedades homeTeamScore y fueraTeamScore y un método como IncreaseScore (equipo: equipo).

Ambos equipos deben poder aumentar su puntuación cuando hacen un gol, pero no puede dar a cada equipo su propia instancia de puntuación; Quieres que ambos accedan y modifiquen el mismo..

Este es un caso en el que un Singleton es una solución perfecta, ya que podría funcionar como una instancia global a la que cualquiera puede acceder; tendrá solo una instancia para todos, por lo que no tiene que preocuparse de que cada equipo modifique una puntuación diferente.


Paso 4: Clase Singleton

Ahora comencemos a crear un singleton en AS3, pero primero recuerde los elementos clave de un singleton:

  • Nadie debe ser capaz de acceder a ella.
  • Sólo uno se puede crear una instancia.

Crea una nueva clase de AS3 y llámala. Singleton.as.

(¿No está familiarizado con la codificación basada en clases? Consulte esta introducción rápida).

Aquí está el código básico de Singleton:

 package public class Singleton instancia de var estática privada: Singleton; // Esta será la instancia única creada por la clase privada estática var isOkayToCreate: Boolean = false; // Esta variable nos ayudará a determinar si se puede crear la instancia. Función pública Singleton () // Si no podemos crear una instancia, genera un error, por lo que no se crea ninguna instancia si (! IsOkayToCreate) arroja un nuevo error (este + "es un Singleton. Acceso mediante getInstance ()");  // Con este método crearemos y accederemos a la instancia de la función estática pública getInstance (): Singleton // Si no hay instancia, créela si (! Instance) // Permitir la creación de la instancia, y una vez creado, deja de ser creado isOkayToCreate = true; instance = new Singleton (); isOkayToCreate = false; trace ("instancia de Singleton creada!");  instancia de retorno; 

Paso 5: crear un proyecto flash

Ahora vamos a probar Singleton, primero cree un nuevo archivo Flash llamado Main.fla. En el panel de propiedades, establezca la clase también en Principal.


Paso 6: Crea un Singleton

Cree una nueva clase llamada "Main" y cree una instancia de Singleton usando el constructor:

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

Guárdelo y ejecútelo, verá que produce un error que nos indica que usemos la función getInstance () en su lugar, así que adelante, haga lo siguiente:

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

Guárdelo y ejecútelo, no hay ningún error ahora, y puede ver en la consola el texto "¡Se creó una instancia de Singleton!", Lo que significa que se creó correctamente.

Entonces, cuando usas una clase Singleton, no puedes usar nuevo Singleton (), tienes que usar Singleton.getInstance () en lugar.


Paso 7: Agregar propiedades a la clase

El Singleton no es muy útil en este momento. Añadamos una propiedad:

 package public class Singleton instancia de var estática privada: Singleton; // Esta será la instancia única creada por la clase privada estática var isOkayToCreate: Boolean = false; // Esta variable nos ayudará a determinar si se puede crear la instancia // nueva propiedad de ejemplo: public var exampleProperty: String = "Esto es un ejemplo"; función pública Singleton () // Si no podemos crear una instancia, generamos un error para que no se cree ninguna instancia si (! isOkayToCreate) arroja un nuevo error (este + "es un Singleton. Acceda usando getInstance ()");  // Con este método crearemos y accederemos a la instancia de la función estática pública getInstance (): Singleton // Si no hay instancia, créela si (! Instance) // Permitir la creación de la instancia, y una vez creado, deja de ser creado isOkayToCreate = true; instance = new Singleton (); isOkayToCreate = false; trace ("instancia de Singleton creada!");  instancia de retorno; 

Ahora en Main.as, Puedes entrar testSingleton.exampleProperty Como si fuera una clase normal. Intenta rastrearlo.


Paso 8: Intenta crear otro Singleton

Para probar que Singleton hace lo que se supone que debe hacer, cree otro singleton y cambie la propiedad de ejemplo de uno de ellos:

 paquete import flash.display.MovieClip; public class Main extiende MovieClip public function Main () var testSingleton: Singleton = Singleton.getInstance (); var anotherSingleton: Singleton = Singleton.getInstance (); anotherSingleton.exampleProperty = "Esto se establece en anotherSingleton"; trace (testSingleton.exampleProperty, anotherSingleton.exampleProperty); 

Qué piensas tú que sucederá?

Esto incluso funciona si creas las variables Singleton en diferentes clases.


Conclusión

El patrón de singleton se puede usar en cualquier código, y lo recomiendo altamente si va a usar solo una instancia de una clase, ya que le da un mejor control de la misma. Espero que te haya gustado este Consejo rápido, gracias por leer.!

Saludos eduardo