Singleton


Olá pessoal!

Vamos falar hoje sobre o padrão de projeto Singleton.

Para melhor entendermos vamos imaginar que temos um sistema que necessita estabelecer conexões em diversos instantes do seu funcionamento com o banco de dados, e dependendo to tamanho do nosso sistema pode ser que ele solicite centenas de conexões com o banco de dados a cada minuto, não seria viável a nível de performance que a cada solicitação desta fosse criada uma nova conexão com o banco de dados, é ai que vamos utilizar o padrão de projetos Singleton, é claro que ele pode ser utilizado em diversos outros cenários, mas no nosso caso vamos exemplificar através deste pois o mesmo é bem didático.

O papel do Singleton é fazer com que uma determinada classe possua apenas uma instância, independente de quantas solicitações forem feitas.

Vamos então simular este cenário com duas classes, uma que representará nossa conexão com o banco de dados e a outra que seria uma usuária desta classe.

Abaixo o código da classe que representa nossas conexões no sistema:


public class ConexaoBanco {

/*Criamos um atributo estático que representará
* nossa única instancia desta classe no sistema
*/
private static ConexaoBanco instancia = null;

/*Aqui estamos tornando nosso construtor privado de
* forma que ele nunca possa ser utilizado por outra
* classe.
*/
private ConexaoBanco() {

}
/*Aqui nosso método que faz o serviço principal do Singleton
* ele verifica se ja existe uma instância desta classe
* caso nao exista ele cria uma e retorna o objeto
* caso exista ele simplesmente retorna o objeto que
* já existe.
*/
public static ConexaoBanco getInstancia() {
if (instancia == null) {
instancia = new ConexaoBanco();
}
return instancia;
}

}

Basicamente os passos que fizemos foram os seguintes:

  1. Criamos um atributo de classe referente a uma instância da classe em questão
  2. Tornamos nosso construtor private de forma que ele só possa ser acessado pela própria classe
  3. Criamos um método estático que verifica se existe uma instância da classe, caso existe ele retorna ela, caso não exista ele retorna uma nova instância.

Agora vamos a nossa classe que utiliza a classe ConexaoBanco:


public class Cliente {

public static void main(String args[]){

/*Obtemos uma instância de ConexaoBanco
* como ainda não havia nenhuma criada no sistema
* ele retorna uma nova instância.
*/
ConexaoBanco con = ConexaoBanco.getInstancia();

//Outros códigos

/*
* Obtemos outra instancia de ConexaoBanco, agora
* como ja havia uma ele retorna a instância que
* já havia sido criada no método anterior.
*/
ConexaoBanco con2 = ConexaoBanco.getInstancia();
}
}

Na nossa classe Cliente ao obtermos um objeto da classe ConexaoBanco pela primeira vez através do método ConexaoBanco.getInstancia(), este método verifica se há uma instancia da

classe criada no sistema, no nosso caso como é a primeira vez que o estamos invocando ele criará um novo objeto de ConexaoBanco e o retornará, agora quando invocarmos novamente o método

ele não criará mais instâncias da classe apenas retornará a que já foi criada anteriormente.

É isso ai, muito simples e util não?!

Abraços!

, ,

  1. Nenhum comentário ainda.
(não será publicado)