O singleton é um tipo de padrão de projeto que garante que uma classe só possa ser instanciada uma única vez, isto é, não será possível usar o new para criar diversas instâncias. Um bom exemplo para explicar esse padrão é, caso tenhamos um repositório que armazena algumas coisas como objetos, strings ou números, etc. Queremos que exista apenas um lugar para armazenar essas coisas. Então, para isso, uma boa ideia é usar o padrão de projeto Singleton. *<<mudar*
Nota:Para a explicação desse padrão estarei utilizando linguagem Java.
Bem, para começar, vamos criar o nosso objeto Livro:
public class Livro {
private String nome;
private String autor;
private String descricao;
public Livro(String nome, String autor) {
this.nome = nome;
this.autor = autor;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public String getNome() {
return nome;
}
public String getAutor() {
return autor;
}
}
Criei um construtor (linha 7 a 10) que recebe nome e autor como parâmetro. Gerei os getters para todos os atributos para que possamos recuperar esses dados do nosso objeto. Além disso criei um setter para descrição, pois não é necessariamente um atributo obrigatório como nome e autor. Perceba que eu não criei setters para nome e autor, fiz isso para não deixar o código maior, mas você pode criar se quiser.
Agora vamos para a criação de nosso repositório. É nele que iremos aplicar o singleton. Para começar, vamos criar a nossa classe:
public class Repositorio {
private static Repositorio repositorio;
private Repositorio() {
}
}
Criei uma variável estática (linha 3) do nosso Repositorio que servirá para verificar se já existe uma instância dessa classe. Perceba que o nosso construtor está com o modificador de acesso privado, isto é, não conseguiremos instanciar essa classe usando o new. Mas como iremos acessar a instância dessa classe? Bem, para isso iremos criar um método público e estático para conseguirmos acessar, então vamos ver como isso irá ficar:
public static synchronized Repositorio getInstance() {
if (repositorio == null) {
repositorio = new Repositorio();
}
return repositorio;
}
É através desse método conseguiremos pegar a instância da classe. Por ser um método public e static conseguimos acessá-lo de outras classes sem instancia-lo. O synchronized servirá para impedir a criação de mais instância quando usando com concorrência. O nome do nosso método se chama getInstance por questões de boas práticas. No nosso bloco if (linha 3 a 5) será feita uma verificação na nossa variável repositorio para ver se já existe uma instância armazenada nela, caso não tenha (null), armazenamos uma nova instância (new Repositorio()). E por fim, retornamos a nossa instância pela variável repositorio (linha 7).
Criado o nosso singleton, agora vamos adicionar um Array List para armazenar esses livros:
import java.util.ArrayList;
import java.util.List;
public class Repositorio {
private static Repositorio repositorio;
List<Livro> livros;
private Repositorio() {
livros = new ArrayList<>();
}
public static synchronized Repositorio getInstance() {
if (repositorio == null) {
repositorio = new Repositorio();
}
return repositorio;
}
public void adicionarLivro(Livro livro) {
livros.add(livro);
}
}
Criei uma variável da interface List (linha 7) e no construtor a inicializei com um ArrayList (linha 10). Fiz um simples método para adicionar um livro ao repositório (linhas 23 a 25), a partir daí você pode adicionar diversos outros métodos como o de remover, modificar, buscar, listar, etc…
Pronto, o nosso singleton está pronto, vamos agora testá-lo:
Perceba que ao tentarmos instanciar a classe recebemos um erro dizendo que o construtor do Repositorio() não está visível. Para resolver isso, vamos pegar o getInstance do nosso Repositorio. O código ficará desse jeito:
Repositorio repositorio = Repositorio.getInstance();
E agora podemos chamar normalmente os outros métodos do repositório:
public class Teste {
public static void main(String[] args) {
Repositorio repositorio = Repositorio.getInstance();
repositorio.adicionarLivro(new Livro("Livro de Teste", "Gabriel Gouveia"));
}
}
Deixe seu feedback logo abaixo!