Posteado por: fzapataramirez | Martes, julio 8, 2008

Patrón Singleton

El patrón de diseño Singleton, permite controlar el número de instancias que existen en la aplicación de un objeto específico.
En ocasiones tenemos clases con una gran cantidad de atributos, propiedades y métodos que consumen gran cantidad de memoria cuando la aplicación esta en ejecución. Si esta clase, se utiliza para almacenar información global para la aplicación en si, como por ejemplo para almacenar en memoria información referente al usuario actual, a sus preferencias, etc. o si esta es una clase que se utiliza como de lectura, es decir, una clase donde se cargan datos para luego ser leído en la aplicación, entonces esta es una clase a la cual le podemos aplicar el patrón Singleton.

Implementando este patrón, podremos garantizar que durante todo el ciclo de vida de la aplicación habrá como máximo una instancia de la clase, ya que haríamos un mal uso de la memoria del PC si en diferentes puntos de la aplicación se crean diferentes instancias de la misma clase cuando se puede hacer todo con la misma instancia.

El primer requisito para implementar el patrón singleton, es hacer privado al constructor de la clase:

class BaseDatos
{
private BaseDatos()
{

}

}

Esto nos permite asegurar que en ninguna parte del código se utilice el operador new (encargado de crear instancias) sobre esta clase. La única manera para poder utilizar el constructor de esta clase, es hacerlo dentro de la misma clase. Y ese es precisamente el siguiente paso, crear un método en la clase que se encargue de llamar el constructor privado, asegurándose obviamente de tener como máximo una instancia.

class BaseDatos
{
private BaseDatos()
{

}

public static BaseDatos obtenerInstancia()
{

}

}

Es necesario que el método encargado de retornar la instancia, sea un método de clase y no de instancia, es decir, un método estático, ya que si el método fuera un método de instancia, seria necesario crear una instancia de la clase para poder utilizar el método y precisamente eso es lo que evitamos (crear nuevas instancias) en el primer paso.

Como saber cuando se han creado o no instancias de la clase?, sencillo………. agregamos un atributo estático (para que pueda ser utilizado desde el método estático) donde se almacena la instancia de la clase y en caso que no se haya creado ninguna instancia, este atributo tendrá un valor nulo.

class BaseDatos
{
private static BaseDatos objeto;

private BaseDatos()
{

}

public static BaseDatos obtenerInstancia()
{

}
}

teniendo este atributo que referencia la instancia creada, podemos implementar la lógica del método encargado de retornar dicha instancia de la clase, así:

class BaseDatos
{
private static BaseDatos objeto;

private BaseDatos()
{

}

public static BaseDatos obtenerInstancia()
{
if (objeto == null)
objeto = new BaseDatos();

return objeto;
}
}

De esta manera, cuando queramos utilizar la clase BaseDatos no se creara la instancia con el operador new como se hace con las clases normales:

BaseDatos baseDatos = new BaseDatos(); //Imposible utilizarlo el operador new ya que el constructor es privado

Sino que por el contrario, utilizamos el método que se ha creado para obtener la instancia.

BaseDatos baseDatos = BaseDatos.obtenerInstancia();

De esta manera, se asegura que se creara máximo una instancia de la clase BaseDatos, aunque el método obtenerInstancia sea llamado más de una vez.

BaseDatos baseDatos1 = BaseDatos.obtenerInstancia(); // Se crea la instancia ya que no existe una creada
BaseDatos baseDatos2 = BaseDatos.obtenerInstancia(); // Se retorna la instancia existente
BaseDatos baseDatos3 = BaseDatos.obtenerInstancia(); // Igualmente se retorna la instancia existente.

En el ejemplo anterior, las variables baseDatos1,baseDatos2,baseDatos3, apuntan a la misma instancia, lo cual implica que si se realizara algún cambio en uno de sus atributos, el cambio se vería reflejado en las tres variables.

 


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: