0

Tutorial - Implementando o Padrão de Projeto Singleton em Java

Mateus Silva
Mateus Silva

Oi, pessoal. Esse artigo é um tutorial em Java de como e quando utilizar o Padrão de Projeto Singleton.


Primeiro é bom saber o que são Padrões de Projeto. Em resumo, eles são: "Padrões são um repertório de soluções e princípios que ajudam os desenvolvedores a criar software e que são codificados em um formato estruturado[...]" (link da referência no final do artigo).


Eles ajudam a evitar problemas durante o desenvolvimento do Software e permitem a melhoria da qualidade facilitando a sua estruturação e manutenção.


Exemplo de Padrões de Projeto:


O padrão Singleton traz uma solução que garante que uma classe tenha somente uma instância durante o todo projeto. Esse padrão é útil em casos quando quer se manter uma única instância, como abaixo:

  • Um único banco de dados;
  • Um único acesso ao arquivo de log;
  • E em casos como será mostrado abaixo.


Imaginem que vocês estão desenvolvendo uma aplicação de cadastro de funcionários de uma faculdade e uma das regras de negócios é: existe apenas um reitor na faculdade; Como evitar que sejam instanciados dois objetos da classe Reitor?


Uma forma é utilizando o padrão Singleton como abaixo:


Classe Reitor:

public class Reitor {
    private String nome;

    private Reitor(){}
    private static Reitor reitor = new Reitor();
    public static synchronized Reitor obterInstancia(){
        return reitor;
    }

    public String obterNome(){
        return reitor.nome;
    }
    
    public void setarNome(String nome){
        this.nome = nome;
    }
}

Como podemos ver acima, a classe reitor é instanciada dentro da própria classe e o seu construtor está com o modificador private impedindo que tentem instanciar uma nova classe através do seu construtor.


O método obterInstancia garante que sempre se retorne a mesma instância.


Classe principal com main:

public class Main {
    public static void main(String[] args) {
        Reitor reitor1, reitor2, reitor3;
        //reitor1 = new Reitor(); Não permite instanciar, contrutor privado

        reitor2 = Reitor.obterInstancia();
        reitor2.setarNome("João");
        reitor3 = Reitor.obterInstancia();
  
        if(reitor2 == reitor3){
            System.out.println("Mesmo reitor");
            System.out.println("Nome do reitor 2 = " + reitor2.obterNome());
            System.out.println("Nome do reitor 3 = " + reitor3.obterNome());
        }
    }
}


Vantagens:

  • Controle sobre a instanciação do objeto.
  • Acesso centralizado e extensível.

Desvantagens:

  • Qualidade da implementação depende da linguagem.
  • Difícil de testar.
  • Forma de inicialização dificulta em ambientes multithreads.
  • Cuidado com o seu uso excessivo para não transformar em um substituto a variáveis globais.


Apesar de ter muitas desvantagens, não quer dizer que não seja uma boa escolha em algumas situações, o importante é aprender quando a sua aplicação é uma boa escolha, sendo importante uma análise sobre os requisitos do software em questão.


Links para artigos anteriores sobre Qualidade de Software:

  • Como avaliar o seu código fonte: https://web.digitalinnovation.one/articles/como-avaliar-o-seu-codigo-fonte?back=%2Farticles&page=1&order=oldest


  • Ocultamento de informação: https://web.digitalinnovation.one/articles/ocultamento-de-informacao-e-information-leakage?back=%2Farticles&page=1&order=oldest


  • O porquê devemos nos preocupar com a qualidade do nosso software: https://web.digitalinnovation.one/articles/o-porque-devemos-nos-preocupar-com-a-qualidade-de-software?back=%2Farticles&page=1&order=oldest


Fonte: http://www.facom.ufu.br/~bacala/ESOF/05b-Padr%C3%B5es%20Gof.pdf


0
0

Comentários (2)

0
R

Raissa Maranhão

14/07/2021 14:15

pode me ajudar com criação de classes no java !

0
Wellington Santos

Wellington Santos

14/07/2021 13:40

Gostei você usou synchronized pra ter certeza que apenas uma instância existe mesmo que esteja em um contexto multi-tarefa, muita gente não sabe disso. Ótimo artigo.


None

Brasil