martes 5 de enero de 2010

Patrón de diseño: SINGLETON

Muy buenas,

volvemos al blog, y vamos bien, a post por año…. hoy voy a comentar un patrón de diseño bastante eficaz: singleton.

El patrón de diseño singleton (o para los de aquí, instancia única) trata de mantener un acceso único a un objeto que solo tendrá una instancia, es decir, es un objeto global y único en nuestra aplicación.

¿Pará que es útil este patrón de diseño? Pués tiene muchas utilidades… por ejemplo, para el acceso a recursos únicos o para tener “a mano” unos datos o funcionalidades para todos los objetos. Para ello, se debe garantizar que el construcctor de nuestra clase singleton sea privada, de esa forma nos aseguramos que solo pueda haber una instancia de la clase:

public class Singleton {
private static Singleton miObjeto = null;
private Singleton() {
}
}

Ahora, solo nos queda el acceso restringido a nuestro objeto. Para ello, solo añadir a la clase un método de recogida de la instancia:

public class Singleton {
private static Singleton miObjeto = null;
private Singleton() {
}
public static Singleton getInstancia() {
if (miObjeto == null) {
miObjeto = new Singleton();
}
return miObjeto;
}
}


Con esto ya tenemos el patrón implementado con lo básico, ahora, solo añadir los métodos que se quieran para hacerlo totalmente funcional.

Para llamar desde nuestro código:

Singleton objetoSingleton = Singleton.getInstancia();

Veamos un pequeño ejemplo. Vamos a tener una clase que se encarga de tener almacenana la conexión con una base de datos MySQL. Para ello, usaremos el patrón Singleton para el acceso a dicha conexión.

public class ConexionSingleton {
private static ConexionSingleton instancia = null;
private java.sql.Connection conexion = null;
private ConexionSingleton() {
}
public static ConexionSingleton getInstancia() {
if (instancia == null) {
instancia = new ConexionSingleton();
}
return instancia;
}
/* devuelve true si se ha creado correctamente */
public boolean crearConexion() {
try {
Class.forName(“com.mysql.jdbc.Driver”);
conexion = DriverManager.getConnection(“urlBaseDatos”, “usuarioBaseDatos”, “passwordBaseDatos”);
} catch (Exception e) {
return false;
}
return true;
}
public java.sql.Connection getConexion() {
if (conexion == null) {
crearConexion();
}
return conexion;
}
}

Llamando desde nuestro código principal:

ConexionSingleton.getInstancia().crearConexion();
java.sql.Connection conexion = ConexionSingleton.getInstancia().getConexion();

Espero que os sea útil. Saludos!

PD: a ver si aprendo a manejar mejor el blog, así no me sale el código tan feote como me ha salido :mrgreen:

1 comentarios:

  1. me sirvio che, con algunas modificaciones. gracias!

    me olvidaba esta pagina esta buen para postar codigo ----> http://ideone.com/

    saludos

    ResponderSuprimir