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..
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..
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.
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.
Ahora comencemos a crear un singleton en AS3, pero primero recuerde los elementos clave de un singleton:
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;
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.
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.
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.
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.
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