Compartilhamento de tecnologia

Implementação do padrão singleton

2024-07-11

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

1. Introdução

1.1 Antecedentes

Quando um aplicativo precisa controlar o compartilhamento de recursos, realizar gerenciamento de configuração e operações de registro de log, um requisito comum é usar um ponto de acesso global para que o programa possa acessá-lo através desse ponto de acesso global, não importa onde ele esteja. informações relevantes da instância. Para atender a essa necessidade, podemos usar o Padrão Singleton. O padrão singleton garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global para acessar essa instância.

Especificamente, o padrão singleton geralmente fornece um método estático (como getInstance()) que retorna a única instância da classe. Como este método é estático, ele pode ser chamado sem criar uma instância da classe. Isso significa que qualquer código que tenha acesso à classe pode obter uma instância singleton chamando esse método estático.

1.2 Objetivo

Este artigo apresentará em detalhes os conceitos básicos e as etapas de implementação do padrão singleton. Através deste artigo, você poderá entender como funciona o padrão singleton e aprender como utilizá-lo de forma eficaz em projetos reais.

2. Qual é o padrão singleton?

Para dar um exemplo interessante, o modelo singleton é como a auréola do protagonista num mundo de anime. Não importa como o enredo se desenvolve, há sempre apenas um protagonista, e todos sabem que ele é o núcleo da história. Dessa forma, não importa como a história se desenrole, todos poderão encontrar a mesma pessoa para impulsionar a trama.

2.1 Vantagens e Desvantagens do Padrão Singleton

vantagem

Garanta uma instância única: evite a criação duplicada de instâncias e economize recursos.
ponto de acesso global: Acesso global conveniente e chamadas simplificadas.
Inicialização lenta: crie instâncias sob demanda para melhorar o desempenho.

deficiência

Difícil de escalar: As classes singleton geralmente são difíceis de estender porque o construtor é privado.
possíveis problemas de desempenho: em um ambiente de alta simultaneidade, algumas implementações podem apresentar problemas de desempenho.
Dificuldade em testar: O padrão singleton pode dificultar os testes porque é um estado global.

2.2 Cenários de uso do modo singleton

De acordo com as características do padrão singleton, seus cenários de uso podem ser divididos nas seguintes categorias:

  • Por exemplo, no caso de compartilhamento de recursos, os dados do arquivo de configuração e os arquivos de log podem ser colocados em um arquivo. Esses dados de configuração ou arquivos de log são lidos uniformemente por um objeto singleton e, em seguida, outros objetos no processo de serviço passam por esse singleton. Os objetos obtêm essas informações de configuração, o que pode simplificar o gerenciamento de configuração em ambientes complexos.
  • No caso de controle de recursos, como pools de threads, o design de pools de threads multithread geralmente adota o modo singleton para facilitar o controle dos threads no pool.

3. Modo de implementação do modo singleton

A implementação do padrão singleton geralmente inclui três elementos:

  1. construtor privado, torne o construtor da classe privado para que o exterior não possa criar uma instância por meio da palavra-chave new.
  2. Pontos de referência estáticos privados para a própria instância, crie uma variável de instância estática dentro da classe para salvar a instância exclusiva.
  3. Métodos estáticos públicos que retornam sua própria instância, forneça um método estático para que o mundo externo possa obter a única instância por meio desse método.

3.1 Padrão Singleton Chinês Faminto

Para o modo singleton estilo Hungry, a instância singleton é construída quando a classe é carregada, o que é thread-safe porque um objeto estático foi criado quando a classe é carregada e a velocidade de resposta é rápida quando chamada. A desvantagem também é óbvia. A eficiência de recursos não é alta, desde que outros métodos estáticos da classe sejam executados ou a classe seja carregada, esta instância ainda será inicializada.

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