Hélio Engholm Jr

Especializado em Engenharia de Software

Figura 11.3 – Diagrama de classe do singletonpattern do exemploIntrodução

O Singleton é um padrão que garante que apenas um objeto de determinada classe seja instanciado pelo sistema. Isso garante que, independentemente do número de usuários simultâneos da aplicação, tenhamos apenas um objeto instanciado. Para utilizá-lo devemos declarar uma classe com construtor privado que impede a instanciação direta de objeto, possuindo um método com modificador static para retornar o objeto singleton. Esse método impede a criação de mais de uma ocorrência do objeto da classe singleton.

Implementando o padrão Singleton

Para implementar o singleton devemos declarar a classe com as seguintes características:

•    Declarar a classe com construtor default do tipo private.

•    Criar na classe um método de acesso syncronized para obter a referência do objeto singleton. Ele deve ser de acesso syncronized para evitarmos problemas de threads.

•    Criar nessa classe um override do método clone() para impedir que algum programador inadvertidamente clone um objeto que deve ser único.

Cenário do exemplo

Imagine um requisito de projeto em que um perfil de usuário pode disparar um determinado processamento de dados de arquivos diversos e que esteja relacionado a índices no sistema por meio de uma interface de usuário. O ponto de atenção é que esse processamento, quando em execução, não pode ser disparado novamente antes de ser finalizado. Desse modo, quando outro usuário com o mesmo perfil acessar essa mesma interface, o sistema deverá, além de mostrar que o processamento já está sendo executado, não disponibilizar a opção de iniciá-lo para qualquer outro usuário que acesse essa interface.

Existem algumas maneiras de resolver essa questão. Neste exemplo foi selecionado o padrão de design Singleton para tratar esse requisito de projeto, já que o objetivo é explorar orientação a objetos e padrões de design.

A figura 11.3 representa a classe IndiceSingleton que implementa e testa este exemplo. Ela possui o membro de dado flagProcessamentoOn, que armazena se o processamento estiver sendo realizado. Nesse exemplo, receberia o valor 1. Na lógica dessa classe, o método processaDados() só realiza o processamento quando esse flag for diferente de um, retornando seu valor para zero no final do processamento.

 

Código-fonte em Java que implementa o exemplo

Veja a seguir o código-fonte em Java que implementa o exemplo apresentado de singleton.

Classe IndiceSingleton

public class IndiceSingleton {

int flagProcessamentoOn = 0;

// Observe que o construtor é private

private IndiceSingleton() {

// Construtor com acesso private

flagProcessamentoOn = -5;

}

private static IndiceSingleton IndiceSingleton;

public static IndiceSingleton getIndiceSingleton() {

if (IndiceSingleton == null) {

IndiceSingleton = new IndiceSingleton();

}

returnIndiceSingleton;

}

public static synchronized IndiceSingleton getSingletonObject() {

if (IndiceSingleton == null) {

IndiceSingleton = new IndiceSingleton();

}

return IndiceSingleton;

}

public Object clone() throws CloneNotSupportedException {

throw new CloneNotSupportedException();

}

public void setFlagProcessamentoOn(intflagProcessamentoOn) {

this.flagProcessamentoOn = flagProcessamentoOn;

}

public int getFlagProcessamentoOn() { return flagProcessamentoOn; }

Classe Principal

public static void main(String[] args) {

// Obtendo uma referência para o singleton

IndiceSingleton is1 = IndiceSingleton.getIndiceSingleton();

// Mostrando o valor default do flag na criação do objeto

System.out.println(“Valor do flagProcessamentoOn para ref 1 >> ” + is1.getFlagProcessamentoOn());

is1.setFlagProcessamentoOn(1);

System.out.println(“Valor do flagProcessamentoOn para ref 1 apos alteracao do flag>> ” + is1.getFlagProcessamentoOn());

// Obtendo outra referência para o singleton

IndiceSingleton is2 = IndiceSingleton.getIndiceSingleton();

System.out.println(“Valor do flagProcessamentoOn para ref 2 >> ” + is2.getFlagProcessamentoOn());

}

Saiba MUITO mais

O livro Análise e Design Orientados a Objetos apresenta diversos exemplos da utilização de diversos patterns.

Utilize este livro para, entre outras coisas, aprender a entender e a utilizar design patterns definitivamente.

Livro Análise e Design

 

Link Novatec: http://www.novatec.com.br/livros/analise-design/

Link Livraria Cultura:

http://www.livrariacultura.com.br/scripts/resenha/resenha.asp?nitem=42129370

Livraria Saraiva: 

http://www.livrariasaraiva.com.br/produto/4912029

 




+ Artigos