Patterns: Singleton

Post on 15-Jul-2015

90 views 2 download

Transcript of Patterns: Singleton

Padrão de Criação de ObjetosSingleton

Instituto Federal de Educação, Ciência e Tecnologiada Paraíba – campus CajazeirasCurso: Análise e Desenvolvimento de SistemasProfessor: Rodrigo AraújoDisciplina: Padrões de Projeto

Fátima FerreiraSérgio Diniz

Uma definição de Singleton

Um jeito fácil de acessar uma instânciade classe global.

Singleton

Exemplo de motivação

Exemplo de motivação

Padrão Singleton

É importante para algumas classes ter uma, e apenas uma,instância.

Embora possam existir muitas impressoras em um sistema,deveria haver somente um spooler de impressoras;

Padrão Singleton - Intenção

O Padrão Singleton é um padrão criacional;

Garantir que uma classe tenha somente uma instância efornecer um ponto de acesso global para a mesma;

Qual a funcionalidade disso?

Objetos que tratam de pools de conexão, saídas gráficas,impressão, objetos que cuidam de registros não devem serinstanciados mais de uma vez

Um outro uso do padrão SINGLETON é quando queremos umaclasse de Log para todo o sistema, sem precisarmos utilizarrecursos do sistema para instanciar uma classe sempre queprecisarmos gravar dados no servidor.

Padrão Singleton - Motivação

Alguns programadores devem estar pensando agora:

Mas isso é fácil! Basta eu ter uma variável global com ainstância do objeto e sempre acessar ela!

O problema é que essa variável sendo inicializada nocomeço da execução do projeto, essa classe estaráconsumindo recursos mesmo sem ser utilizada!

Com o Singleton, a classe só é instanciada quandovocê realmente precisa dela!

Padrão Singleton - Motivação

Padrão Singleton - Motivação

Como prevenir que um objeto não seja instanciado maisde uma vez?

Padrão Singleton - Motivação Criar um construtor privado. Com isso, a classe só pode serinstanciada dentro de algum dos seus próprios métodos!

Melhor maneira de tornar a classe responsável por manter o controle da sua única instância;

Padrão Singleton - Aplicabilidade

Use o padrão Singleton quando:◦ For preciso haver apenas uma instância de uma classe, e essa

instância tiver que dar acesso aos clientes através de umponto bem definido;

◦ A única instância tiver de ser extensível através desubclasses, possibilitando aos clientes usar uma instânciaestendida sem alterar o seu código;

Padrão Singleton - Estrutura

Lógica da classe: "Se o meu atributo instance é diferente denull retorno ele senão vou instanciar ele e retorná-lo. Assima próxima chamada a getInstance() vai retornar o mesmoobjeto, independente de se na chamada anterior ele era ounão diferente de null e todas as próximas chamadas,enquanto dure a aplicação sempre retornará o mesmoobjeto."

Padrão Singleton - Estrutura

Padrão Singleton - Participantes

◦ A classe Singleton será a classe cujo controle de instânciaúnica será aplicado. Ela possui como responsabilidades ocontrole da criação da única instância, e prover o pontode acesso a essa instância.

◦ Os clientes são todas as outras classes que irão acessar ainstância única através do método getSingleton() da classeSingleton.

Padrão Singleton - Colaborações

• Nesse padrão de projeto, irão ocorrer iterações entre a classeSingleton e os clientes. A classe Singleton possui um métodoestático getSingleton() que fornece aos clientes a únicainstância da classe. Desse modo, garantimos a existência de umponto único de acesso a esse objeto.

• Para garantirmos que o objeto seja único durante a execução,devemos desabilitar o acesso ao construtor da classe poroutras classes. A única classe que deve possuir acesso aoconstrutor é a própria classe Singleton, e nenhuma outra. Issopode ser feito tornando o construtor da classe privado.

Padrão Singleton - Consequências

Acesso controlado a instância única

◦ A própria classe encapsula sua instância única e, portanto, tem estritocontrole sobre como e quando os clientes a acessam;

Redução no namespace

◦ O Singleton é uma alternativa eficiente às variáveis globais. Evitapoluir o namespace com variáveis globais que armazenam instânciasúnicas;

Permite um número variável de instâncias◦ Pode permitir a criação de mais de uma instância do Singleton ou até

controlar o número de instâncias existentes. Somente a operaçãoinstance() precisa ser modificada;

• A implementação do padrão Singleton é bastante simples.Para tal, devemos primeiro adicionar uma variável estáticado mesmo tipo da classe na própria classe. Essa variáveldeverá ser privada, para evitar que outras classes possammodificá-la;

• A seguir, devemos adicionar um método público e estáticogetSingleton() à classe, que irá verificar se a instância foicriada. Se não foi criada ainda, esse método irá criar ela. Porfim, esse método retorna a instância armazenada.

Padrão Singleton - Implementação

• Para garantir que a instância seja única, e que nenhumcliente possa criar uma nova instancia da classe Singleton,devemos proteger o construtor da classe, para que apenas ométodo getSingleton() possa criar uma nova instância.

• Qualquer classe cliente irá fazer uma chamada ao métodoestático getSingleton() para obter a instância única daclasse. No momento em que for feita a primeira chamadaao método a instância será criada. Nas chamadas seguintes,a mesma instância será retornada.

Padrão Singleton - Implementação

Padrões RelacionadosVários padrões podem ser implementados UtilizandoSingleton, em particular:◦ Abstract Factory;

◦ Builder;

◦ Prototype;

Padrão Singleton - Exemplos

Exemplo 01• Imagine a seguinte situação:

• Imagine que tenhamos um Janela, essa seria nossa classe,chamada Janela...

Suponhamos que temos duas funções (que chamamos demétodos), seriam Abrir() e Fechar();

Então...

Exemplo 01

A questão é que para podermos acessar umaclasse e seus métodos/atributos temos queinstanciá-la.

Até aí tranquilo? Mas há um problema .

Toda vez que tivermos que abrir ou fechar essa janela, vamos ter queinstanciar?

Exemplo 01

Exemplo 01 – Solução Singleton

Exemplo 02

• “Imagine uma aplicação onde se faz necessáriocriar um arquivo de log para registrar quandousuário loga no sistema.”

Solução

Solução

Exemplo 03• Imagine a seguinte situação

• “Suponha que você deve trabalhar em um projetocomputacional para uma determinada fabrica de carros, osistema cadastrar carros da Ford e da Fiat, e deve controlar aquantidade de carros fabricados, e gerar um relatórioinformando esses dados. Contudo, não é cabível que existamais do que uma fábrica de carros para realizar esse controle.”

Atividade

Imagine a seguinte situação:

◦ “Gostaria de criar uma classe que gerasse uma conexão com meubanco de dados. Quando eu acessar a primeira vez essa classe, seráconstruída uma conexão, mas no decorrer da execução, caso existamais acessos ao banco, gostaria de utilizar a MESMA classe com aMESMA conexão."

Atividade