O padrão singleton é um dos padrões de projeto mais simples. Uma classe que usa o padrão de design singleton tem uma única instância que ela gerencia sozinha. Essa classe impede que qualquer outra classe crie uma instância dela.
Uma classe singleton também fornece um único ponto de acesso global à instância que ela cria. Portanto, qualquer classe que deseja uma instância de uma classe singleton precisa acessá-la por meio de seu único ponto de acesso.
O excelente suporte de Java para programação orientada a objetos facilita o uso do padrão de projeto singleton.
Implementando o padrão Singleton usando Java
Existem muitas maneiras de implementar o padrão singleton em Java; as abordagens ansiosas e preguiçosas são variações comuns. Cada uma dessas abordagens tem seus próprios méritos e desvantagens. Portanto, o método que você escolhe empregar deve depender de como seu aplicativo funcionará.
A abordagem ansiosa
A implementação do padrão singleton com a abordagem ansiosa significa que a classe cria uma nova instância de si mesma quando é carregada.
públicoaulaEagerSingleton{
privadoestático Instância EagerSingleton = novo EagerSingleton();privadoEagerSingleton(){}
públicoestático EagerSingleton getInstance(){
retornar instância;
}
}
O EagerSingletonclasse Java cria uma nova instância de si mesmo enquanto carrega. Ele atribui esta instância à estática privada variável de instância, que só é acessível dentro da classe singleton. O único ponto de acesso externo à variável de instância é por meio do getInstance() método. Esse método retorna a instância da classe criada anteriormente.
Essa abordagem é ótima, pois evita que o multithreading problema, que é um dos maiores desafios do padrão singleton. Ele resolve o problema de multithreading criando uma nova instância de si mesmo antes que qualquer novo thread possa acessar sua variável de instância. Isso garante que cada thread terá acesso apenas à mesma instância.
No entanto, a abordagem ansiosa só é prática se seu aplicativo usar uma instância da classe singleton ao iniciar a execução. Caso contrário, você criará um objeto antes que seu aplicativo precise dele, usando recursos desnecessariamente.
A Abordagem Preguiçosa
A abordagem preguiçosa é a solução para o problema da abordagem ansiosa. Ele permite que você crie uma nova instância de uma classe singleton somente quando seu programa precisar.
públicoaulaLazySingleton{
privadovolátilestático Instância LazySingleton;privadoLazySingleton(){}
públicoestático LazySingleton getInstance(){
se (instância == nulo) {
sincronizado (PreguiçosoSingleton.aula) {
se (instância == nulo) {
instância = novo PreguiçosoSingleton();
}
}
}
retornar instância;
}
}
A abordagem preguiçosa resolve o problema de multithreading usando o sincronizado palavra-chave. Isso evita que dois threads obtenham acesso à variável de instância ao mesmo tempo. Sincronizado é caro, portanto, o aplicativo só o usa uma vez, quando chama getInstance() pela primeira vez.
Quando usar o padrão Singleton
O padrão Singleton é útil em muitos cenários, para criar caixas de diálogo, manipular configurações de registro ou gerenciar pools de threads.
Outro uso comum para o padrão singleton é criar uma classe central que gerencia conexões de banco de dados.