padrões-10 - padrões criacionais - singleton
DESCRIPTION
Padrões de Projeto. Padrão Criacional. Singleton.TRANSCRIPT
![Page 1: Padrões-10 - Padrões Criacionais - Singleton](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/1.jpg)
Padrões de Projeto
Padrões Criacionais Singleton
![Page 2: Padrões-10 - Padrões Criacionais - Singleton](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022050720/549693ceb47959744d8b506f/html5/thumbnails/24.jpg)
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();