15 de jun de 2012

Singleton Pq e como utilizar!

Este é um padrão de projeto muito conhecido, este post não tem a finalidade de mostrar o que é um Singleton, o real intuito deste post é mostrar como aplicar este padrão de projeto que considero com um dos mais uteis.


Primeiramente, Singleton, é um padrão de projeto de software. Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto(Wiki ). Por esta definição ja da para imaginar algumas utilidades para ele, mas antes disto vamos mostrar como é sua implementação em java.
 

public class Singleton {

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



Primeiramente, a classe deve possuir um construtor privado, pois apenas apenas ela mesma poderá criar uma instancia de si. A classe deve possuir um atributo estático que guarda a sua instancia, pois é ele que fará este controle. E finalmante deve possuir um método responsavel por retornar a instancia como é mostrado no getInstance.

Outra maneira de criar um Singleton é utilizando enumaration, na verdade é a melhor maneira de se criar um Singleton pois a JVM mantem apenas uma isntancia do mesmo, o código ficaria da seguinte forma:
public enum Singleton {
  INSTANCE;
  
  public void metodoQualquer(){
  }
}  


Como um enumeration não possui construtor não será necessária a criação de nenhuma forma de controle.

Cuidados que devem ser tomados ao utilizar um Singleton

Como este padrão de projeto permite um acesso centralizado é interessante lembrar que caso ele possua coleções internamente é importante que sejam sincronizadas, para evitar concorrencia. Como no exemplo abaixo:
 

public class Singleton {

    private static final Map<String, List<String>> syncCollection = Collections.synchronizedMap(new HashMap<String, List<String>>());
    private static Singleton instance;
    
    private Singleton (){
        
    }
    
    public static Singleton getInstance() {
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}


 
Depois de mostrar como criar um Singleton vamos ver para qual finalidade criar o mesmo. Vou fazer uma lista de utilização do Singleton :

  • Bundle para internacionalização do sistema.
  • Pool de imagens, principalmente utilizado em games.
  • Pool de objetos, geralmente utilizado em gerenciadores, também aplicado a games e servidores de aplicação.
  • Classe de interface gráfica que devem manter o estado, telas de configuração e edições.


Criação de Bundle do sistema


Quando se deseja criar um sistema de internacionalização do sistema o primeiro passo é a criação de um arquivo (.properties), a caracteristica principal deste arquivo é ser uma representação de um map, ou seja, chave = valor. Como arquivos de internacionalização podem ser relativamente grandes e muito utilizados, não é viável ler um arquivo de texto completamente sempre que necessário. Então utilizamos uma classe Singleton que armazena em um map as informações contidas no arquivo, desta forma teremos a informação com um rapido acesso.


Criação de pool de imagens


Aplicações gráficas necessitam muitas vezes de vários icones e imagens personalizadas, muitas vezes estas imagens se repetem muito no sistema, e criar uma nova instancia de um objeto imagem sempre que necessitamos de uma nova imagem se torna invável devido a quantidade de memória utilizada, para isto deve-se criar uma classe Singleton que ao iniciar a aplicação armazene todas as imagens do sistemas, sendo assim o usuário buscará de a cordo com a necessidade, possuindo apenas uma instancia do objeto imagem e a referenciando-a ao longo do código.


Criação de interface gráfica que devem manter estado


Quando estamos criando uma tela de interface gráfica que deve manter o seu estado mesmo depois de fechada e não pode ser aberta duas vezes, a melhor opção é tornar esta tela um singleton. Um grande exemplo seria tela de configuração do sistema, ou ainda mais, a tela principal do sistema que geralmente necessita ser referenciada por outras, facilitando muito esta função.

Finalmente, a utilização de Singleton pode melhorar consideravelmente a performace do sistema pois diminui a utilização de memória e a quantidade de operações de entrada e saída.

Nenhum comentário:

Postar um comentário