Padrões-10 - Padrões Criacionais - Singleton

24
Padrões de Projeto Padrões Criacionais Singleton

description

Padrões de Projeto. Padrão Criacional. Singleton.

Transcript of Padrões-10 - Padrões Criacionais - Singleton

Page 1: Padrões-10 - Padrões Criacionais - Singleton

Padrões de Projeto

Padrões Criacionais Singleton

Page 2: Padrões-10 - Padrões Criacionais - Singleton

2 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Singleton

•  Assegura que uma classe tenha apenas uma instância e provê um ponto de acesso global a ela

Page 3: Padrões-10 - Padrões Criacionais - Singleton

3 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivação

•  É importante a algumas classes ter exatamente uma instância – Ex.: várias impressoras, mas apenas um

spool de impressão. Um único sistema de arquivos, um único gerenciador de janelas etc

– Como garantir a única instância e o acesso fácil a ela? • Variável global? é possível instanciar múltiplos

objetos...

Page 4: Padrões-10 - Padrões Criacionais - Singleton

4 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivação

•  A melhor solução é fazer a própria classe responsável por manter “rastreável” sua única instância. – Assegurar que nenhuma outra instância seja

criada (interceptando requisições de criação de novos objetos)

– Prover uma forma de acesso a esta instância •  Esta solução é o padrão Singleton

Page 5: Padrões-10 - Padrões Criacionais - Singleton

5 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Aplicação

• Use Singleton quando: – Deve haver exatamente uma instância de

uma classe e ela deve ser acessível a clientes a partir de um ponto de acesso bem conhecido

– A instância única deve ser extensível via especialização e os clientes devem ser aptos a usar uma instância estendida sem modificar seu código

Page 6: Padrões-10 - Padrões Criacionais - Singleton

6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Estrutura

Page 7: Padrões-10 - Padrões Criacionais - Singleton

7 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Participante

•  Singleton – Define uma operação Instance que permite

aos clientes acessarem sua instância única. Instance é uma operação da classe (isto é, uma função membro estática em C++)

– Pode ser responsável por criar sua própria instância única

Page 8: Padrões-10 - Padrões Criacionais - Singleton

8 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Colaborações

• Clientes acessam a instância de um Singleton apenas através da operação Instance do Singleton

Page 9: Padrões-10 - Padrões Criacionais - Singleton

9 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Conseqüências

1.  Acesso controlado à instância única 2.  Espaço de nomes reduzido 3.  Permite um número variável de

instâncias 4.  Mais flexível que operações de classe

Page 10: Padrões-10 - Padrões Criacionais - Singleton

10 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Assegurar uma instância única: esconder a operação que cria a instância atrás de uma operação de classe que garanta que somente uma instância seja criada

Page 11: Padrões-10 - Padrões Criacionais - Singleton

11 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Note que o construtor é protegido. Um cliente que tente inicializar Singleton diretamente receberá um erro em tempo de compilação

•  Note também que Instance usa lazy initialization

Page 12: Padrões-10 - Padrões Criacionais - Singleton

12 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação •  Veja que não basta apenas definir o singleton como uma

variável global ou objeto estático, porque: –  Não é possível garantir que somente uma instância de um

objeto estático seja declarada –  Pode-se não ter toda a informação necessária para a

instanciação de todo singleton no instante da inicialização estática

–  C++ não define a ordem na qual os construtores para objetos globais são chamados, isto significa que não pode haver nenhuma dependência entre singletons, caso contrário, erros serão inevitáveis.

–  Além é claro, da desvantagem de objetos globais/estáticos (todos os singletons são criados, independente deles serem usados ou não)

Page 13: Padrões-10 - Padrões Criacionais - Singleton

13 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Especializando classes Singleton – A técnica mais simples é determinar qual singleton se

quer usar de dentro da operação Instance (p.ex., via variável de ambiente)

– Outra forma de se escolher a subclasse de Singleton é colocar Instance dentro das subclasses (liga-se um objeto que contém uma implementação diferente – portanto, escondendo-se isto da implementação do cliente)

– Uma terceira forma é usar um registro de singletons

Page 14: Padrões-10 - Padrões Criacionais - Singleton

14 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação - Registro

•  Ao invés de Instance definir um conjunto de possíveis classes Singleton, as classes Singleton registram suas instâncias pelo nome em um registro bem conhecido

•  O registro mapeia entre nomes e singletons •  Quando Instance precisa de um singleton, ele

consulta o registro pelo nome •  O registro procura pelo singleton

correspondente (se existe) e o retorna •  Esta técnica libera Instance de ter que conhecer

todas as possíveis classes de Singleton

Page 15: Padrões-10 - Padrões Criacionais - Singleton

15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

Page 16: Padrões-10 - Padrões Criacionais - Singleton

16 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

Page 17: Padrões-10 - Padrões Criacionais - Singleton

17 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

• Onde as classes Singleton se registram? •  Em seu construtor?

•  Problema: o construtor só é chamado se a classe já tiver sido chamada...

Page 18: Padrões-10 - Padrões Criacionais - Singleton

18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Solução: definir uma instância estática

•  Neste caso, a classe não é mais responsável por criar o singleton, mas apenas torná-lo acessível no sistema.

•  A desvantagem é que as instâncias de todas as possíveis subclasses Singleton devem ser criadas ou não serão registradas

Page 19: Padrões-10 - Padrões Criacionais - Singleton

19 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

No exemplo da MazeFactory, precisa-se apenas de uma única instância da fábrica de labirinto.

Exemplo 1: considera-se que nunca haverá subclasses de MazeFactory

Exemplo 2: há subclasses de MazeFactory

Page 20: Padrões-10 - Padrões Criacionais - Singleton

20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo 1

Page 21: Padrões-10 - Padrões Criacionais - Singleton

21 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo 1

Page 22: Padrões-10 - Padrões Criacionais - Singleton

22 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo 2

Page 23: Padrões-10 - Padrões Criacionais - Singleton

23 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo 2

• Note que Instance deve ser modificada sempre que se define uma nova subclasse de MazeFactory

• Uma possível solução é o registro de singletons

• Outra solução é fazer “linkagem” dinâmica.

Page 24: Padrões-10 - Padrões Criacionais - Singleton

24 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

•  Para criar um labirinto que contenha cômodos encantados, basta chamar CreateMaze de um EnchantedMazeGame:

EnchantedMazeGame game;

game.CreateMaze();