patterns: singleton

39
Padrão de Criação de Objetos Singleton Instituto Federal de Educação, Ciência e Tecnologia da Paraíba – campus Cajazeiras Curso: Análise e Desenvolvimento de Sistemas Professor: Rodrigo Araújo Disciplina: Padrões de Projeto Fátima Ferreira Sérgio Diniz

Upload: fatinha-de-sousa

Post on 15-Jul-2015

90 views

Category:

Education


2 download

TRANSCRIPT

Page 1: 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

Page 2: Patterns: Singleton

Uma definição de Singleton

Page 3: Patterns: Singleton

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

Singleton

Page 4: Patterns: Singleton

Exemplo de motivação

Page 5: Patterns: Singleton

Exemplo de motivação

Page 6: Patterns: Singleton

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;

Page 7: Patterns: Singleton

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.

Page 8: Patterns: Singleton

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!

Page 9: Patterns: Singleton

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

Page 10: Patterns: Singleton

Padrão Singleton - Motivação

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

Page 11: Patterns: Singleton

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;

Page 12: Patterns: Singleton

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;

Page 13: Patterns: Singleton

Padrão Singleton - Estrutura

Page 14: Patterns: Singleton

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

Page 15: Patterns: Singleton

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.

Page 16: Patterns: Singleton

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.

Page 17: Patterns: Singleton

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;

Page 18: Patterns: Singleton

• 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

Page 19: Patterns: Singleton

• 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

Page 20: Patterns: Singleton

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

◦ Builder;

◦ Prototype;

Page 21: Patterns: Singleton

Padrão Singleton - Exemplos

Page 22: Patterns: Singleton

Exemplo 01• Imagine a seguinte situação:

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

Page 23: Patterns: Singleton

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.

Page 24: Patterns: Singleton

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

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

Exemplo 01

Page 25: Patterns: Singleton

Exemplo 01 – Solução Singleton

Page 26: Patterns: Singleton

Exemplo 02

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

Page 27: Patterns: Singleton

Solução

Page 28: Patterns: Singleton

Solução

Page 29: Patterns: Singleton

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.”

Page 30: Patterns: Singleton
Page 31: Patterns: Singleton
Page 32: Patterns: Singleton
Page 33: Patterns: Singleton

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."

Page 34: Patterns: Singleton

Atividade

Page 35: Patterns: Singleton
Page 36: Patterns: Singleton
Page 37: Patterns: Singleton
Page 38: Patterns: Singleton
Page 39: Patterns: Singleton