Padrões-10 - Padrões Criacionais - Singleton
-
Upload
nicola-zagari -
Category
Technology
-
view
2.050 -
download
4
description
Transcript of Padrões-10 - Padrões Criacionais - Singleton
Padrões de Projeto
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
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...
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
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
6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura
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
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
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
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
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
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)
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
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
15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Implementação
16 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Implementação
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...
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
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
20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo 1
21 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo 1
22 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo 2
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.
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();