Notas sobre patrones de diseño de Java para principiantes: patrón Singleton

El contenido de este artículo está extraído principalmente de los patrones de diseño de GoF y "Java and Patterns" de Yan Hong. 

 

Modo singleton, también llamado modo singleton. La definición es la siguiente: (consulte el patrón de diseño GoF)

 

1. Preparación:

Asegúrese de que solo haya una instancia de una clase y proporcione un punto de acceso global a ella.

 

2. Participantes:
• Clase Singleton (Singleton)
: define una operación getInstance() para permitir que los clientes accedan a su única instancia. getInstance() es una operación de clase (un método estático).
- puede ser responsable de crear su propia instancia única.

 

3. Diagrama de estructura:

 


Según esta definición, los clientes solo pueden acceder a una instancia Singleton mediante la operación del método getInstance() de la clase Singleton. 

 

En "Java and Patterns" de Yan Hong, se da la siguiente definición:

El patrón Singleton garantiza que una clase tenga solo una instancia, se instancia a sí misma y proporciona esta instancia a todo el sistema. Esta clase se llama clase singleton.

 

¿Cuándo utilizar el patrón singleton?

De la definición se puede ver que el patrón singleton debe usarse solo cuando el sistema requiere que una clase tenga solo una instancia.

 

Puntos clave e implementación del patrón singleton:

1. Una clase singleton solo puede tener una instancia: una variable miembro estática del tipo de clase singleton;

2. Una clase singleton sólo puede crear su propia instancia única; el constructor debe ser privado;

3. La clase singleton debe proporcionar esta instancia a todos los demás objetos; existe un método estático común para devolver la propia instancia de la clase singleton.

 

 

En Java, el patrón singleton tiene dos formas: ansioso y perezoso.

El código correspondiente es el siguiente:

 

estilo chino hambriento (ansioso)

Una clase singleton crea una instancia de sí misma cuando se carga.

  

/*
 * 饿汉(eager)式单例类
 */
public class EagerSingleton {
	
//	一个静态的单例类类型的成员变量
	private static final EagerSingleton m_instance = new EagerSingleton();
	
	/**
	 * 私有构造函数,保证外界无法直接实例化
	 */
	private EagerSingleton(){}
	
	/**
	 * 静态工厂方法,返回单例类自己的实例
	 */
	public static EagerSingleton getInstance(){
		return m_instance;
	}
}

 

perezoso

Una clase singleton crea una instancia de sí misma la primera vez que se hace referencia a ella.

El enfoque diferido debe manejar las restricciones de acceso cuando varios subprocesos hacen referencia a esta clase por primera vez al mismo tiempo. 

 

/*
 * 懒汉(lazy)式单例类
 */
public class LazySingleton {
	
//	一个静态的单例类类型的成员变量
	private static LazySingleton m_instance = null;
	
	/**
	 * 私有构造函数,保证外界无法直接实例化
	 */
	private LazySingleton(){}
	
	/**
	 * 静态工厂方法,返回单例类自己的实例,
	 * 使用了同步化synchronized,和一个if判断,来处理多线程环境。
	 */
	
	synchronized public static LazySingleton getInstance(){
		if(m_instance == null){
			m_instance = new LazySingleton();
		}
		
		return m_instance;
	}

}

 

Existe otra forma de patrón singleton que utiliza ejemplos de doble verificación, pero en "JAVA and Patterns" de Yan Hong se señala que los ejemplos de doble verificación no son adecuados para los compiladores de Java.

La razón básica es que en el compilador de Java, el orden de inicialización de la clase LazySingleton y la asignación de variables de m_instance es impredecible. Si un hilo lee la referencia m_instance sin sincronización y llama a un método en este objeto, puede encontrar que el proceso de inicialización del objeto no se ha completado, lo que provoca un bloqueo.

 

El bloqueo de doble verificación no es adecuado para Java debido al modelo de memoria de Java. Consulte el  bloqueo de doble verificación y el modo singleton.

 

 

Supongo que te gusta

Origin blog.csdn.net/louis_lee7812/article/details/83772777
Recomendado
Clasificación