Singleton de forma simples
Singleton é um padrão criacional que garante uma única instância para um objeto, além de fornecer um ponto de acesso global para essa instância. Em outras palavras, o objeto será criado apenas uma vez em todo o processo. Imagine que você está construindo um sistema para uma escola. Este sistema deverá viabilizar dentre outras funcionalidades, a matricula de alunos. Durante o processo de cadastro é necessário indicar o diretor vigente, que é único. Dentre várias possibilidades, o padrão Singleton tem o objetivo de solucionar este tipo de problema. Vamos implementar um código na prática sem um padrão bem definido e com o Singleton. Acompanhe: Sem Singleton Classe Diretor com construtor publico @Getter public class Diretor { private String nome; private String sobrenome; public Diretor(String nome, String sobrenome) { this.nome = nome; this.sobrenome = sobrenome; } } Sempre que diretor for instânciado, um novo objeto será criado public class Main { public static void main(String[] args) { Diretor diretor = new Diretor("josé", "Silva"); System.out.println("Nome:" + diretor.getNome()); System.out.println(diretor); Diretor outroDiretor = new Diretor("josé", "Silva"); System.out.println("Nome:" + outroDiretor.getNome()); System.out.println(outroDiretor); } } Notem que são dois objetos diferentes. Imagine que em cada ponto do sistema, um novo objeto será criado, possibilitando trocar o valor dos atributos. Isso pode causar decisões conflitantes, bugs e resultados não esperados. Por isso uma necessidade de criar um objeto único... Com Singleton Classe diretor criada, mas dessa vez com um construtor privado. Isso significa que apenas a classe diretor terá acesso ao próprio construtor. @Getter public class Diretor { private static Diretor instance; private String nome; private String sobrenome; private Diretor(String nome, String sobrenome) { this.nome = nome; this.sobrenome = sobrenome; } public static Diretor getInstance(String nome, String sobrenome) { if (instance == null) { instance = new Diretor(nome, sobrenome); } return instance; } } Agora a classe cliente deverá chamar o método getInstance(), que por sua vez devolverá sempre a mesma instância caso ela já exista. public class Main { public static void main(String[] args) { Diretor diretor = Diretor.getInstance("joão", "Silva"); System.out.println("Nome:" + diretor.getNome()); System.out.println(diretor); Diretor outroDiretor = Diretor.getInstance("fulado", "de tal"); System.out.println("Nome:" + outroDiretor.getNome()); System.out.println(outroDiretor); } } Notem que agora, o objeto retornado sempre será o mesmo, pois foi instânciado apenas uma vez.

Singleton é um padrão criacional que garante uma única instância para um objeto, além de fornecer um ponto de acesso global para essa instância. Em outras palavras, o objeto será criado apenas uma vez em todo o processo.
Imagine que você está construindo um sistema para uma escola. Este sistema deverá viabilizar dentre outras funcionalidades, a matricula de alunos. Durante o processo de cadastro é necessário indicar o diretor vigente, que é único. Dentre várias possibilidades, o padrão Singleton tem o objetivo de solucionar este tipo de problema.
Vamos implementar um código na prática sem um padrão bem definido e com o Singleton. Acompanhe:
Sem Singleton
Classe Diretor com construtor publico
@Getter
public class Diretor {
private String nome;
private String sobrenome;
public Diretor(String nome, String sobrenome) {
this.nome = nome;
this.sobrenome = sobrenome;
}
}
Sempre que diretor for instânciado, um novo objeto será criado
public class Main {
public static void main(String[] args) {
Diretor diretor = new Diretor("josé", "Silva");
System.out.println("Nome:" + diretor.getNome());
System.out.println(diretor);
Diretor outroDiretor = new Diretor("josé", "Silva");
System.out.println("Nome:" + outroDiretor.getNome());
System.out.println(outroDiretor);
}
}
Notem que são dois objetos diferentes. Imagine que em cada ponto do sistema, um novo objeto será criado, possibilitando trocar o valor dos atributos. Isso pode causar decisões conflitantes, bugs e resultados não esperados. Por isso uma necessidade de criar um objeto único...
Com Singleton
Classe diretor criada, mas dessa vez com um construtor privado. Isso significa que apenas a classe diretor terá acesso ao próprio construtor.
@Getter
public class Diretor {
private static Diretor instance;
private String nome;
private String sobrenome;
private Diretor(String nome, String sobrenome) {
this.nome = nome;
this.sobrenome = sobrenome;
}
public static Diretor getInstance(String nome, String sobrenome) {
if (instance == null) {
instance = new Diretor(nome, sobrenome);
}
return instance;
}
}
Agora a classe cliente deverá chamar o método getInstance(), que por sua vez devolverá sempre a mesma instância caso ela já exista.
public class Main {
public static void main(String[] args) {
Diretor diretor = Diretor.getInstance("joão", "Silva");
System.out.println("Nome:" + diretor.getNome());
System.out.println(diretor);
Diretor outroDiretor = Diretor.getInstance("fulado", "de tal");
System.out.println("Nome:" + outroDiretor.getNome());
System.out.println(outroDiretor);
}
}
Notem que agora, o objeto retornado sempre será o mesmo, pois foi instânciado apenas uma vez.