Olá a todos, javaRush!
Hoje vou falar sobre o padrão de design
Singleton
(único).
Objetivo: criar uma classe que terá apenas UM objeto. Isso significa que não importa quantas vezes ele seja acessado, o mesmo objeto que foi criado na primeira vez será retornado. Isso é algo conveniente e necessário em muitos lugares, não é à toa que está sendo implementado em frameworks.
Aplicativo:
- Por exemplo, você precisa conectar um banco de dados a um projeto e uma classe que será responsável por conectar-se a ele. A conexão é criada uma vez e não há necessidade de criá-la repetidamente
Application settings
— uma classe responsável pelas configurações de conexão necessárias para a aplicação: host e porta do banco de dados, etc. Eles são criados uma vez e usados durante toda a operação do aplicativo.
- Existem muitos outros exemplos que não mencionei, então escreva suas opções nos comentários! =)
Após esta introdução, pelo que entendi, podemos mostrar um exemplo desta classe: (Embora eu tenha certeza de que cada um de nós pode criar uma implementação disso) Aqui está o exemplo mais simples, quando tornamos o construtor privado, ou seja, Você não pode criar um objeto explicitamente. E existe um método estático
getInstance()
que fornece um objeto.
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Existem problemas com multithreading e então você pode colocar um método
getInstance()
marcador
synchronized
:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
No final, como sempre, quero dizer que se você pensa diferente ou encontra algum erro em mim, escreva nos comentários! Discutiremos tudo com prazer :) Se gostou do artigo escreva “+” e eu saberei. Isso é importante para mim :) PS: Estou adicionando mais implementações: De acordo com
Joshua Bloch , esta é a melhor maneira de implementar o modelo
Enum Singleton
public enum Singleton {
INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
E mais
On Demand Holder idiom
:
public class Singleton {
public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
+
Inicialização lenta
+
Alto desempenho
-
Não pode ser usado para campos de classe não estáticos Qualquer dúvida/sugestão - escreva nos comentários!
Veja também meus outros artigos:
GO TO FULL VERSION