Páginas

quinta-feira, 13 de janeiro de 2011

Singleton Design Pattern

O singleton é um padrão criacional, ou seja, ele trata da criação de objetos. Através dele, garantimos que apenas uma única instância do objeto seja instanciada em todo o projeto. Qual a funcionalidade disso? Simples, objetos     que tratam de pools de conexão, saídas gráficas, impressão, objetos que cuidam de registros ou de logs não devem ser instanciados mais de uma vez! Já imaginou instanciar dois objetos que lidam com a impressora ao mesmo tempo? Isso iria gerar muitos problemas!


Alguns programadores devem estar pensando agora: Mas isso é fácil! Basta eu ter uma variável global com a instância do objeto e sempre acessar ela! O problema é que essa variável sendo inicializada no começo da execução do projeto, essa classe estará consumindo recursos mesmo sem ser utilizada! Com o Singleton, a classe só é instanciada quando você realmente precisa dela!

    Mas como previnir que um objeto não seja instanciado mais de uma vez? A solução é simples! Muitos desconhecem, mas é possível criar um construtor privado! Com isso, a classe só pode ser instanciada dentro de algum dos seus próprios métodos!


public class Singleton {
    private Singleton () { }
}

    Agora que só podemos instanciar a classe dentro de um método, vamos fazer com que esse método nos garanta que apenas uma classe seja inicializada. Para isso vamos ter uma variável estática que guardará a instância do único objeto instanciado. Caso ela esteja nula, a função irá instanciar o objeto e então retorná-lo para o usuário. Caso ela já contenha uma instância, o método apenas retorna o objeto. Em código, temos:

public class Singleton {
    private static Singleton instancia = null;

    private Singleton () { }

    public static Singleton getInstance() {
        if(instancia==null) instancia = new Singleton ();
        return instancia;
    }
}

    Pronto! Nossa classe agora é um Singleton! Não é possível ter mais de uma instância desse objeto! Como se faz para instanciar um objeto já que não posso simplesmente dar um “new” nele?

Singleton c1 = Singleton.getInstance();
Singleton c2 = Singleton.getInstance();

    Em nosso exemplo, c1 e c2 representam o mesmo objeto! 



Nenhum comentário: