Bienvenidos sean a este post, hoy hablaremos sobre un patron que es utilizado especialmente por otros engines de juegos.
Cuando hablamos de singleton nos referimos a un patron que nos dara una sola cosa de algo y lo mas importante que nos garantizara solamente ese de algo, y lo que nos referimos con eso solo es a la instancia de la clase, ademas podemos usar este patron para permitir acceso global a parte de la informacion o metodos, tambien nos posibilita que pueda ser usado desde cualquier parte del proyecto y siempre garantizando que las partes/clases del proyecto que acceden a la clase lo hacen siempre por la misma instancia.
La solucion a este enigma es simple, la clase que sera del singleton debe tener todos los metodos declarados como publicos y estaticos, pero como podemos garantizar que solo una instancia sea creada? para esto vamos a crear un codigo de ejemplo, simple, para poder ver como trabaja.
La siguiente clase no sera parte de nuestro juego pero la usaremos de ejemplo para explicar algunos conceptos, primero vamos a crear una clase hipotetica:
class ClaseSingleton {
}
Con nuestra clase creada vamos a declarar un nuevo objeto de la siguiente forma:
class ClaseSingleton {
private static ClaseSingleton mNuestrainstancia;
}
Lo que declaramos es una instancia de tipo privada y estatica que es del mismo tipo de la clase misma, nuestro siguiente paso sera agregar el constructor en la clase:
class ClaseSingleton {
private static ClaseSingleton mNuestrainstancia;
private claseSingleton(){
... instrucciones ...
}
}
Este constructor sera privado, primero para evitar la creacion de instancias y por otro lado al ser privada solo podra ser accedida dentro de la clase, y recordemos que podemos agregar algunas instrucciones dentro del constructor siempre y cuando sea de tipo privada, a continuacion agregaremos un metodo para poder acceder al objeto que creamos al principio:
class ClaseSingleton {
private static ClaseSingleton mNuestrainstancia;
private claseSingleton(){
... instrucciones ...
}
static ClaseSingleton getInstancia(Context contexto){
if (mNuestrainstancia == null)
mNuestrainstancia = new ClaseSingleton();
return mNuestrainstancia;
}
}
Este nuevo metodo lo declaramos como estatico para lograr que solamente de esta forma se pueda obtener un ClaseSingleton, al tener un acceso predeterminado (ni publico o privado) permite que cualquier clase dentro del paquete pueda acceder a la misma y por el mismo precio nos permite que se pueda llamar al metodo sin necesidad de una instancia u objeto creado, la particularidad de este metodo es el condicional donde verifica si mNuestrainstancia es igual a null, en caso de ser cierto procede a crear la instancia con el constructor de esta clase, al ser privado lo crea como referencia, en cambio si existe el objeto o instancia ignora al condicional y devuelve al mismo, es decir una referencia a dicho objeto.
Para nuestro siguiente paso vamos a crear dos metodos, porque toda clase debe tener un proposito, uno va a ser de tipo estatico y el otro no:
class ClaseSingleton {
private static ClaseSingleton mNuestrainstancia;
private claseSingleton(){
... instrucciones ...
}
static ClaseSingleton getInstancia(Context contexto){
if (mNuestrainstancia == null)
mNuestrainstancia = new ClaseSingleton();
return mNuestrainstancia;
}
static void algunaFuncion(){
... instrucciones ...
}
void otraFuncion(){
... instrucciones ...
}
}
En este caso tenemos las dos funciones pero cual sera la diferencia? La diferencia va a radicar en el acceso ya que algunaFuncion al ser estatica nos permite llamarla sin instancia en cambio otraFuncion si o si va a necesitar ser instanciada, esto implica que en el primer metodo no necesitaremos el uso de getInstancia porque podremos acceder a la clase directamente pero en cambio para la segunda funcion sera nuestra llave de acceso.
Con todo esto ya tenemos una clase de ejemplo, vamos a ver como seria ponerla en practica, para ello primero crearemos el objeto de la siguiente manera:
ClaseSingleton cs = ClaseSingleton.getInstancia();
Si se preguntan porque trabajamos de esta forma y no como siempre ahora pasamos a resolverlo, si recuerdan el constructor es privado por lo tanto no puede ser accedido desde fuera de la clase, para ello tenemos a getInstancia porque donde verificaba si no existia (o igual a null) llamaba al constructor y creaba uno nuevo, con esto no solo creamos el objeto sino tambien en la memoria y lo tomamos como referencia, es decir que todas las llamadas iran al mismo lugar, tambien nos posibilita la llamada de los dos metodos:
ClaseSingleton.algunaFuncion();
cs.otraFuncion();
La primera al ser estatica nos permite llamarla directamente desde la clase y la otra como tiene una referencia en un objeto nos permite instanciar a la misma para poder ejecutarla, si bien esto tiene tanto defensores como detractores en ambientes de trabajo para trabajar con video juegos tiene sus ventajas.
En resumen, hoy hemos visto el concepto de Singleton, como es, para que se usa, como podemos crearlo, como se aplica el concepto de privado y estatico, por ultimo como puede beneficiarnos, esto es simplemente una explicacion teorica pero mas adelante como se aplica a nuestro proyecto, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.


Donación
Es para mantenimento del sitio, gracias!
$1.00
