Latest web development tutorials

patrón Singleton

Singleton (Patrón Singleton) Java es uno de los patrones de diseño más simple. Este tipo de patrones de diseño pertenecen crear esquema, que proporciona la mejor manera de crear objetos.

Este modelo implica una sola clase que se encarga de crear sus propios objetos, garantizando al mismo tiempo que se crea un único objeto. Esta clase proporciona un objeto único de su visita, se puede acceder directamente, no es necesario crear una instancia de un objeto de esa clase.

Nota:

  • 1, clase singleton puede tener sólo un ejemplo.
  • 2, clase Singleton debe crear su propia instancia única.
  • 3, clase Singleton debe proporcionar este ejemplo para todos los demás objetos.

introducción

Intención: para asegurarse de que sólo una instancia de una clase, y proporcionar un punto de acceso global para acceder a ella.

La principal solución: utilizar una clase mundial con frecuencia crea y destruye.

Cuándo utilizar: Cuando se quiere controlar el número de casos en los que, para ahorrar recursos del sistema.

¿Cómo resolver: determinar si el sistema ya tiene este único caso, si regresa, si no es así creada.

El código de la llave: el constructor es privado.

Ejemplos de aplicación: 1, una de las partes sólo pueden tener un presidente.2, Windows es un multi-proceso, multi-hilo, en la operación de un archivo cuando inevitablemente múltiples procesos o hilos simultáneamente un documento del fenómeno, el procesamiento de todos los archivos debe ser realizado por una instancia única. 3, algunos de los equipos gerente se diseña a menudo como un modelo de un solo caso, por ejemplo, un equipo con dos impresoras en la salida cuando sea necesario para hacer frente a dos impresoras no pueden imprimir el mismo archivo.

Ventajas: 1, sólo una instancia en la memoria, reduciendo la sobrecarga de la memoria, especialmente frecuentes crear y destruir instancias (como la Escuela de Gestión Inicio caché de páginas).2, para evitar la ocupación múltiple de los recursos (por ejemplo, las operaciones de escritura de archivos).

Contras: no hay interfaz, no se heredan, y la única responsabilidad principio de conflicto, una clase sólo debe estar preocupado por la lógica interna, no en el exterior como la forma de crear una instancia.

Escenarios de uso: 1, prevé la presentación de un número de serie único.2, contadores WEB, no todas las bases de datos en Riga una vez con un solo caso para refrescar en caché. 3, un objeto creado por la necesidad de un consumo excesivo de recursos, como la conexión de E / S a la base de datos y así sucesivamente.

Nota: getInstance () método requiere el uso de la sincronización de bloqueo sincronizado (Singleton.class) para evitar que múltiples hilos en la instancia causa es instanciado varias veces.

realización

Vamos a crear una claseSingleObject.SingleObject clase tiene su propio constructor privado y una instancia estática.

SingleObjectclase proporciona un método estático para la obtención de fuera de su instancia estática.SingletonPatternDemo,nuestras clases de demostración utilizando la claseSingleObjectobjeto de conseguirSingleObject.

patrón Singleton diagrama UML

Paso 1

Crear una clase Singleton.

SingleObject.java

SingleObject public class {

   // Crear un objeto SingleObject ejemplo SingleObject private static = new SingleObject ();

   // Hacer constructor privado, por lo que la clase no se ejecutarán SingleObject privada () {}

   // Obtener el único objeto de pública disposición estática SingleObject getInstance () {
      volver instancia;
   }

   ShowMessage public void () {
      System.out.println ( "Hello World!");
   }
}

Paso 2

Obtener objeto único de la clase Singleton.

SingletonPatternDemo.java

SingletonPatternDemo public class {
   principales argumentos (String []) {public static void

      // // Constructor ilegal de error de tiempo de compilación: Constructor SingleObject () no es visible // objeto SingleObject = new SingleObject ();

      // Obtener el único objeto objeto disponible SingleObject = SingleObject.getInstance ();

      // Mostrar mensaje object.showMessage ();
   }
}

paso 3

Verifique la salida.

Hello World!

Varios aplicación patrón Singleton

Implementar patrón singleton un número de maneras, como sigue:

1, el estilo perezoso, multi-hilo

Son inicialización perezosa: Sí

Son seguros multi-hilo: No

Lograr Dificultad: Fácil

Descripción: Este método es la forma más básica para lograr esta implementación, el mayor problema no es compatible con multi-threading.Debido a que no hay bloqueo sincronizado, por lo que el sentido estricto no es un producto único.
La carga diferida de esta manera, obviamente, no requiere hilo de seguridad, el trabajo en un multi-hilo no funciona.

Ejemplos de código:

public class Singleton {  
    Singleton instancia estática privada;  
    Singleton privada () {}  
  
    public static Singleton getInstance () {  
    si (ejemplo == null) {  
        instancia = new Singleton ();  
    }  
    volver instancia;  
    }  
}  

La próxima presentación de varias implementaciones soporta múltiples hilos, pero difieren en el rendimiento.

2, estilo perezoso, multi-hilo

Son inicialización perezosa: Sí

Son seguros multi-hilo: Sí

Lograr Dificultad: Fácil

Descripción: de esta manera tiene una buena carga diferida, puede funcionar bien en un multi-hilo, sin embargo, es muy baja eficiencia, el 99% de los casos no requiere sincronización.
Ventaja: La primera llamada se ha inicializado, para evitar el desperdicio de memoria.
Contras: debe estar bloqueado sincronizados para asegurar un solo caso, pero la cerradura afectarán la eficiencia.
getInstance () el rendimiento de la aplicación no es crítica (que utilizan con menos frecuencia).

Ejemplos de código:

public class Singleton {  
    Singleton instancia estática privada;  
    Singleton privada () {}  
    public static sincronizada Singleton getInstance () {  
    si (ejemplo == null) {  
        instancia = new Singleton ();  
    }  
    volver instancia;  
    }  
} 

3, la fórmula de hambre

Son la inicialización perezosa: No

Son seguros multi-hilo: Sí

Lograr Dificultad: Fácil

Descripción: Es más común, pero propenso a objetos de basura.
Ventajas: no con llave, se mejora la eficiencia.
Desventajas: cargador de clases se inicializa, la memoria se pierde.
Se basa en el mecanismo de classloder evita multihilo sincronización, sin embargo, ejemplo, cuando se crea una instancia cargador de clases, aunque la clase causa la carga de una variedad de razones, la mayoría del patrón Singleton es llamar al método getInstance, pero no se puede determinar hay otras maneras (u otros métodos estáticos) conduce a la carga de clases, esta vez al parecer no alcanzó inicialización de instancia efecto de carga diferida.

Ejemplos de código:

public class Singleton {  
    estática instancia privada Singleton Singleton = new ();  
    Singleton privada () {}  
    public static Singleton getInstance () {  
    volver instancia;  
    }  
}  

4, cierre de doble verificación / bloqueo doble control (DCL, que es bloqueo doble comprobación)

versión de JDK: JDK1.5 de

Son inicialización perezosa: Sí

Son seguros multi-hilo: Sí

Darse cuenta de la dificultad: más compleja

Descripción: Este método utiliza el mecanismo de bloqueo doble, la seguridad y, en el caso de múltiples hilos para mantener un alto rendimiento.
rendimiento getInstance () de las aplicaciones es crítico.

Ejemplos de código:

public class Singleton {  
    volátil Singleton estática privada;  
    Singleton privada () {}  
    public static Singleton getSingleton () {  
    si (Singleton == null) {  
        sincronizado (Singleton.class) {  
        si (Singleton == null) {  
            Singleton Singleton = new ();  
        }  
        }  
    }  
    Singleton regresar;  
    }  
}  

5, tipo de registro / clases internas estáticas

Son inicialización perezosa: Sí

Son seguros multi-hilo: Sí

Darse cuenta de la dificultad: general

Descripción: Este método se puede lograr el modo de bloqueo de doble comprobación mismo efecto, pero la aplicación más fácil.Utilice la inicialización perezosa de campo estático se debe utilizar de esta manera en lugar de doble comprobar el modo de bloqueo. Esto sólo se aplica al caso de un campo estático, vuelva a comprobar el modo de bloqueo puede ser utilizado cuando sea necesario retardo para inicializar campos de instancia.
Este enfoque también se aprovecha de los mecanismos classloder para asegurar que sólo inicialización de instancia un hilo, es de 3 maneras diferentes es: siempre que la tercera vía se carga la clase Singleton, la instancia se crea una instancia (carga lenta no alcanzado efecto), pero este enfoque es se carga la clase Singleton, instancia no puede ser inicializado. Debido a que la clase SingletonHolder no se utiliza de forma activa, sólo se muestra a través de la llamada al método getInstance, aparece cargado de clase SingletonHolder, que se emplea instancia. Imagínese, si usted instancia instancia de recurso-intensiva, por lo que quería retrasar la carga, por el contrario, cuando no se desea crear una instancia del cargador de clases Singleton, ya que no puede garantizar la clase Singleton también puede estar activo en otras áreas de manera que sea cargada, esta vez para crear una instancia instancia claramente inadecuado. Esta vez, de esta manera en comparación con los tres primeros tipos de formas que es muy razonable.

Ejemplos de código:

public class Singleton {  
    SingletonHolder privada clase estática {  
    privado static final Singleton INSTANCIA = new Singleton ();  
    }  
    Singleton privada () {}  
    public static final de Singleton getInstance () {  
    volver SingletonHolder.INSTANCE;  
    }  
}   

6, enumerar

versión de JDK: JDK1.5 de

Son la inicialización perezosa: No

Son seguros multi-hilo: Sí

Lograr Dificultad: Fácil

Descripción: Esta aplicación aún no ha sido ampliamente adoptado, pero esta es la mejor manera de implementar el patrón Singleton.Es más concisa mecanismo de apoyo a la serialización, automática para evitar varias instancias de la absoluta.
Este enfoque es Effective Java autor Josh Bloch de manifiesto el camino que no sólo puede evitar problemas de sincronización multi-hilo, pero también es compatible de forma automática mecanismo de serialización deserialización para evitar que vuelva a crear un nuevo objeto, absolutamente evitar que múltiples instancias. Sin embargo, dado que sólo se unió después de propiedades de enumeración jdk1.5, escribir de esta manera no puede evitar sentir extraña, en la práctica, rara vez se utiliza.
No por el ataque de reflexión para llamar al constructor privado.

Ejemplos de código:

public enum {Singleton  
    INSTANCIA;  
    whateverMethod public void () {  
    }  
}  

La regla de oro: En circunstancias normales, no se recomienda el uso del primer tipo y la manera perezosa segundo tipo, se recomienda utilizar una tercera vía hombre hambriento.Sólo cuando se quiere aplicar el efecto de carga lenta es clara, vamos a utilizar los primeros cinco tipos de formas de registrarse. Si se trata de deserializar objetos para crear, puede intentar utilizar el modo de enumeración sexto. Si usted tiene otras necesidades especiales, se puede considerar el uso de una cuarta vuelva a comprobar el modo de bloqueo.