Compartir tecnología

Implementación del patrón singleton.

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Introducción

1.1 Antecedentes

Cuando una aplicación necesita controlar el intercambio de recursos, realizar la gestión de la configuración y registrar operaciones, un requisito común es utilizar un punto de acceso global para que el programa pueda acceder a él a través de este punto de acceso global sin importar dónde se encuentre. información relevante de la instancia. Para satisfacer esta necesidad, podemos utilizar el patrón Singleton. El patrón singleton garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global para acceder a esa instancia.

Específicamente, el patrón singleton generalmente proporciona un método estático (como getInstance()) que devuelve la única instancia de la clase. Dado que este método es estático, se puede llamar sin crear una instancia de la clase. Esto significa que cualquier código que tenga acceso a la clase puede obtener una instancia singleton llamando a este método estático.

1.2 Propósito

Este artículo presentará en detalle los conceptos básicos y los pasos de implementación del patrón singleton. A través de este artículo, podrá comprender cómo funciona el patrón singleton y aprender cómo utilizarlo de manera efectiva en proyectos reales.

2. ¿Qué es el patrón singleton?

Para dar un ejemplo interesante, el modelo singleton es como el halo del protagonista en un mundo de anime. No importa cómo se desarrolle la trama, siempre hay un solo protagonista y todos saben que él es el núcleo de la historia. De esta manera, no importa cómo se desarrolle la historia, todos podrán encontrar a la misma persona para impulsar la trama.

2.1 Ventajas y desventajas del patrón Singleton

ventaja

Garantizar una sola instancia: Evite la creación duplicada de instancias y ahorre recursos.
punto de acceso global: Acceso global conveniente y llamadas simplificadas.
Inicialización diferida: cree instancias bajo demanda para mejorar el rendimiento.

defecto

Difícil de escalar: Las clases singleton suelen ser difíciles de ampliar porque el constructor es privado.
posibles problemas de rendimiento: En un entorno de alta concurrencia, algunas implementaciones pueden tener problemas de rendimiento.
Dificultad en la prueba.: El patrón singleton puede dificultar las pruebas porque es un estado global.

2.2 Escenarios de uso del modo singleton

Según las características del patrón singleton, sus escenarios de uso se pueden dividir en las siguientes categorías:

  • Por ejemplo, en el caso de compartir recursos, los datos del archivo de configuración y los archivos de registro se pueden colocar en un archivo. Estos datos de configuración o archivos de registro son leídos uniformemente por un objeto singleton, y luego otros objetos en el proceso de servicio pasan este singleton. Los objetos obtienen esta información de configuración, lo que puede simplificar la gestión de la configuración en entornos complejos.
  • En el caso de controlar recursos, como grupos de subprocesos, el diseño de grupos de subprocesos múltiples generalmente adopta el modo singleton para facilitar el control de los subprocesos en el grupo.

3. Modo de implementación del modo singleton

La implementación del patrón singleton suele incluir tres elementos:

  1. constructor privado, haga que el constructor de la clase sea privado para que el exterior no pueda crear una instancia a través de la nueva palabra clave.
  2. Puntos de referencia estáticos privados a su propia instancia, cree una variable de instancia estática dentro de la clase para guardar la instancia única.
  3. Métodos estáticos públicos que devuelven su propia instancia., proporcione un método estático para que el mundo exterior pueda obtener la única instancia a través de este método.

3.1 Patrón singleton chino hambriento

Para el modo singleton estilo Hungry, la instancia singleton se construye cuando se carga la clase, lo cual es seguro para subprocesos porque se crea un objeto estático cuando se carga la clase y la velocidad de respuesta es rápida cuando se llama. La desventaja también es obvia: mientras se ejecuten otros métodos estáticos de la clase o se cargue la clase, esta instancia aún se inicializará.

/**    
 * 饿汉单例模式:在还没有实例化的时候就初始化
 */
public class Hungry {    
  	//1. 开始时就创建实例
	private static final Hungry instance=new Hungry();
	
	// 2. 私有化的构造方法
	private void hungry() {  
	}
	
	public static Hungry getInstance() { 
		// 返回单例名
		return instance;  		
	}
}