Los patrones de diseño: Singleton

semifallo

Singleton (Patrón Singleton) es uno de los más fáciles en los patrones de diseño Java. Este tipo de patrón de diseño pertenece crear esquema, que ofrece la mejor manera de crear objetos.

Este modelo implica una sola clase que se encarga de crear sus propios objetos, al tiempo que garantiza que sólo se crea un único objeto. Esta clase proporciona la única forma de acceder al objeto tenga acceso directo, sin instancia de la clase de objeto.
nota:

  1. Sólo una instancia de clase Singleton.

  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.

Principalmente para resolver: a clases globales utilizadas para crear y destruir frecuencia.

¿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: como SessionFactory de Hibernate, que actúa como una fuente de almacenamiento de datos proxy, y es responsable de la creación de objetos de sesión. SessionFactory no ligero, bajo circunstancias normales, un proyecto por lo general sólo requiere un suficiente SessionFactory, entonces se usará el patrón Singleton

Utilizar: 1, requiere la producción de un número de serie único. 2, contadores WEB, no siempre tienen tiempo para refrescarse, los casos individuales de caché congénita en la base de datos de Riga. 3, las necesidades de un objeto para crear un consumo excesivo de recursos, tales como conexiones de E / S a la base de datos y así sucesivamente.

Varias implementaciones de patrón singleton

1, tipo chino hambre (constantes estáticas)

Ejemplos de código:

public class SingletonDemo1 {

    private final static SingletonDemo1 instance = new SingletonDemo1();

    private SingletonDemo1(){}

    public static SingletonDemo1 getInstance(){
        return instance;
    }
}

Son perezosos inicialización : No

Son seguros multi-hilo : Sí

Darse cuenta de la dificultad : Fácil

Descripción: Este método comúnmente usado, pero los objetos de basura propensas.
Ventajas: no bloqueado, la eficiencia mejorará.
Desventajas: inicializa cuando se carga la clase, perdiendo la memoria.
Se basa en el mecanismo de classloder evita el multihilo problema de sincronización, sin embargo, instancia a instancia de la clase se carga en el momento, aunque hay causas carga de clases son muchos, la mayoría de ellos en el modo de singleton están llamando método getInstance, pero no se puede determinar hay otras maneras (u otros métodos estáticos) conduce el cargador de clases, que al parecer no alcanzan inicialización de instancia efecto de carga diferida.

2, fórmula de hambre (bloque de código estático)

Ejemplos de código:

public class SingletonDemo {

    private final static SingletonDemo instance;

    private SingletonDemo(){}

    static{
        instance = new SingletonDemo();
    }

    public static SingletonDemo getInstance(){
        return instance;
    }
}

El primer análisis de la misma

3, del hombre perezoso (seguro de rosca)

public class SingletonDemo {

    private static SingletonDemo instance;

    private SingletonDemo(){

    }

    public static SingletonDemo getInstance(){

        if(instance == null){
            instance = new SingletonDemo();
        }
        return instance;
    }

}

Son perezosos inicialización: Sí

Son seguros multi-hilo: No

Lograr Dificultad: Fácil

Descripción: Esta es la forma más básica de ejecución, que logró el mayor problema no es el soporte multi-threading. Debido a que no hay bloqueo sincronizado, por lo que en sentido estricto no es un producto único.
Obviamente esta manera la carga diferida, no requiere seguro para subprocesos, puede no funcionar en multi-hilo correctamente.

4, fórmula perezoso (método de sincronización)

public class SingletonDemo4 {

    private static SingletonDemo4 instance;

    private SingletonDemo4(){

    }

    public static synchronized SingletonDemo4 getInstance(){

        if(instance == null){
            instance = new SingletonDemo4();
        }
        return instance;
    }

}

Son perezosos inicialización: Sí

Son seguros multi-hilo: Sí

Lograr Dificultad: Fácil

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

5, fórmula perezoso (bloque de sincronización)

public class SingletonDemo5 {

    private static SingletonDemo5 instance;

    private SingletonDemo5(){

    }

    public static  SingletonDemo5 getInstance(){

        if(instance == null){
            synchronized(SingletonDemo5.class){
                instance = new SingletonDemo5();
            }
        }
        return instance;
    }

}

6, el doble bloqueo del sujeto / bloqueo doble comprobación (la DCL, es decir, cierre de doble marcado)

public class SingletonDemo6 {

    private static SingletonDemo6 instance;

    private SingletonDemo6(){

    }

    public static SingletonDemo6 getInstance(){

        if(instance == null){
            synchronized(SingletonDemo6.class){
                if(instance == null){
                    instance = new SingletonDemo6();
                }
            }
        }
        return instance;
    }

}

Son perezosos inicialización: Sí

Son seguros multi-hilo: Sí

Darse cuenta de la dificultad: más compleja

Descripción: Este mecanismo de doble modo de bloqueo, y en múltiples hilos de seguridad pueden mantener un alto rendimiento.
Rendimiento getInstance () es fundamental para la aplicación.

7, basado Register-/ clases internas estáticas

public class SingletonDemo7 {

    private SingletonDemo7(){

    }
    private static class SingletonInstance {
        private static final SingletonDemo7 INSTANCE = new SingletonDemo7();
    }

    public static synchronized SingletonDemo7 getInstance(){
        return SingletonInstance.INSTANCE;
    }

}

Son perezosos inicialización: Sí

Son seguros multi-hilo: Sí

Darse cuenta de la dificultad: general

Descripción: Este método se puede lograr el mismo efecto de retención doble el modo de bloqueo, pero la implementación es más sencilla. Inicialización del campo estático utilizando un retardo, este modo se debe utilizar en lugar del modo de detección de bloqueo doble. Esta forma de realización se aplica sólo al campo estático, el modo de detección de bloqueo doble se puede utilizar cuando un retraso necesario inicializar campos de instancia.
De esta manera el mismo mecanismo ventaja classloder para asegurar que sólo un hilo a la inicialización de instancia, es ahora la tercera formas son diferentes: Las tres primeras formas siempre que se carga la clase Singleton, la instancia se crea una instancia (no alcanzaron la carga diferida efecto), pero este enfoque está siendo cargado clase Singleton, instancia no se puede inicializar. Debido a que la clase SingletonInstance no se utiliza de forma activa, sólo se muestra cuando se invoca el método getInstance aparece clases de carga SingletonInstance a instancia instantiate. Imagínese, si usted instancia instancia es que consume muchos recursos, por lo que quiere que se carga demora, por el contrario, no quieren cargar cuando la clase se instancia Singleton, clase Singleton porque no pueden garantizar que la iniciativa también se puede utilizar en otros lugares con el fin de cargada, esta vez a la instancia instantiate claramente inapropiado. Esta vez, de esta manera en comparación con los tres primeros tipos de formas que es muy razonable.

8, Enumerar

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

Son perezosos inicialización: No

Son seguros multi-hilo: Sí

Lograr Dificultad: Fácil

Descripción: Esta aplicación no ha sido ampliamente adoptado, pero esta es la mejor manera de lograr la modalidad de un solo modo. Es más compacto, mecanismo de soporte de serialización automática para evitar varias instancias de la absoluta.
Este enfoque es defendido Effective Java autor manera Josh Bloch, 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 para evitar deserialización volver a crear un objeto nuevo, absolutamente a prevenir múltiples instancias. Sin embargo, sólo se unió a las propiedades de enumeración después JDK1.5, escribir de esta manera no puede dejar de sentir extraña, en la práctica, rara vez se utiliza.
No por la reflexión atacar a llamar al constructor privado.

Publicado 40 artículos originales · ganado elogios 9 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/aawmx123/article/details/101169794
Recomendado
Clasificación