viernes, 17 de febrero de 2012

Singleton - Java

A veces por motivos de eficiencia necesitamos instanciar un solo objeto de una clase. Esto puede ser posible por ejemplo si necesitamos tener el estado del objeto coordinado. Debido a esta necesidad surge un diseño de clase llamado Singleton. Mediante este diseño conseguiremos que solo exista una instancia de nuestra clase.

He visto varios ejemplos diferentes de implementación de Singleton. El mejor ejemplo que he visto, desde mi punto de vista, es el que muestro aquí. Este fue el que me recomendaron en una empresa. Existen otras implementaciones más sencillas de entender, sin embargo está evita problemas en ejecución concurrente.

Veamos por fin este diseño, en esta entrada he decidido cambiar y usar Java como lenguaje:
public class Singleton {
   // El constructor debe ser Protected para evitar su acceso desde fuera.
   protected Singleton() {}
 
 // Clase estatica oculta. Tan solo se instanciara el singleton una vez
   private static class SingletonHolder { 
  // El constructor de Singleton puede ser llamado desde aquí al ser protected
     private final static Singleton INSTANCE = new Singleton();
   }
   
   // Método para obtener la instancia de nuestra clase
   public static Singleton getInstance() {
     return SingletonHolder.INSTANCE;
   }
}

Un main de ejemplo:
public class SingltetonMain {

 public static void main(String arg[]){
  Singleton single1 = Singleton.getInstance();
  Singleton single2 = Singleton.getInstance();
  System.out.println(single1 == single2);
 }
}

9 comentarios:

  1. Ruego por favor que los comentarios tengan un mínimo de ortografía. Existen ciertos errores que hacen daño a los ojos y más aún cuando los lees juntos. Yo alguna vez también cometo alguno, pero intento evitarlos.

    Gracias

    ResponderEliminar
  2. Excelent explicación, muy buena voy a probar.

    ResponderEliminar
  3. esta es una de las mejores explicaciones de este patrón de diseño que he encontrado en la web, había muchas pero ninguna fué tan clara como esta :) ... y por supuesto funcional , gracias ..!!!

    ResponderEliminar
  4. Muchas gracias!, un ejemplo fácil y práctico, saludos!

    ResponderEliminar
  5. public static HelloWorld getInstance(){
    if(instanceHW == null){
    instanceHW = new HelloWorld();
    }
    return instanceHW;
    }

    otra manera de hacerlo cambiando a private el constructor

    ResponderEliminar
    Respuestas
    1. de hecho deberia ser el constructor private, porque si te deja instanciarlo con "new" desde el main

      Eliminar
  6. El ejemplo de esta sitio es claro
    https://apuntes-para-no-olvidar.blogspot.mx/2011/08/el-patron-de-diseno-singleton.html#comment-form

    Buen Post muy claro pero hay que saber cuando utilizarlo que es donde viene lo interesante.

    Una forma eficaz de utilizarlo es en la clase Conexion esto ahorrara memoria mejorará el desempeño de un sistema ya que para cada vez que se hace un operación que tenga que ver con la llamada a la clase conexion se realizaran las acciones cada vez que la llames.. hay que considerar eso.

    Como funcionaria o en que ayudaría el utilizar Singleton la respuesta es sencilla como en tu ejemplo muestras la captura estatica de la hora asi es como funciona ñla conexion solo se realiza una vez para que cada vez que la llames ya te devuelva un valor y no se cree la conexión nuevamente
    Saludos espero la aportación les sirva hay diferentes maneras de aplicarlo tambn lo hice en un Login..

    ResponderEliminar