Baixe o app para aproveitar ainda mais
Prévia do material em texto
Análise e Projeto de Sistemas II Material das Aulas disponível no AVA Aula 2 MSc. Karen Figueiredo – karen@ic.ufmt.br Exemplos de Padrões -Singleton- Padrões de Projeto 2 Categorias dos Padrões: Padrões de Criação Abstraem o processo de instanciação Tornam um sistema independente da forma como os objetos são criados, compostos e representados Singleton 3 Utilizado para criar objetos únicos para os quais só existe uma instância Motivação: Garantir que exista apenas um objeto instanciado de uma classe, independente do número de requisições para criá-lo. Você não deseja várias cópias do objeto nem seus valores expostos. Você quer garantir que cada objeto em sua aplicação esteja usando o mesmo recurso global. É o padrão mais simples (em termos do diagrama de classes) Singleton 4 Há muitos objetos dos quais precisamos apenas de um: grupos de linhas, caixas de diálogo, objetos que cuidam de preferências e configurações, objetos para registros, drivers de dispositivos, bancos etc. O que pode acontecer se instanciar o objeto mais de uma vez? Comportamento inadequado do programa Uso excessivo de recursos Resultados inconsistentes Singleton 5 Propósito: Assegurar o controle da quantidade de instâncias da classe Garantir um ponto de acesso global a ela (bem conhecido) Singleton 6 Como implementar um objeto único? (Java) Como criar um objeto? Singleton 7 Como implementar um objeto único? (Java) Como criar um objeto? new MyClass(); Singleton 8 Como implementar um objeto único? (Java) Como criar um objeto? Se outro objeto quisesse criar um MyClass? Poderia chamar new MyClass de novo? new MyClass(); Singleton 9 Como implementar um objeto único? (Java) Como criar um objeto? Se outro objeto quisesse criar um MyClass? Poderia chamar new MyClass de novo? new MyClass(); Sim, claro. Singleton 10 Como implementar um objeto único? (Java) Como criar um objeto? Se outro objeto quisesse criar um MyClass? Poderia chamar new MyClass de novo? Então, se tivermos uma classe, sempre poderemos instanciá-la uma ou mais vezes? new MyClass(); Sim, claro. Singleton 11 Como implementar um objeto único? (Java) Como criar um objeto? Se outro objeto quisesse criar um MyClass? Poderia chamar new MyClass de novo? Então, se tivermos uma classe, sempre poderemos instanciá-la uma ou mais vezes? new MyClass(); Sim, claro. Sim, mas apenas se for uma classe pública. Singleton 12 E se não for pública? Singleton 13 E se não for pública? Apenas as classes do pacote poderão instanciá-la. Singleton 14 E se não for pública? Você sabia que o código abaixo é possível? O que ele significa? Apenas as classes do pacote poderão instanciá-la. public MyClass { private MyClass() { } } Singleton 15 E agora existe algum objeto que possa instanciar a classe, usando o seu construtor? public MyClass { private MyClass() { } } Singleton 16 E agora existe algum objeto que possa instanciar a classe, usando o seu construtor? A própria classe! Mas isso faz sentido? public MyClass { private MyClass() { } } Singleton 17 Utilizamos um método estático getInstance() e retornamos a instância da classe Você não faz instâncias com o padrão Singleton, você pede para fazer! public MyClass { private MyClass() {} public static MyClass getInstance() { return new MyClass(); } } Singleton 18 E agora como podemos criar um objeto MyClass? public MyClass { private MyClass() {} public static MyClass getInstance() { return new MyClass(); } } Singleton 19 E agora como podemos criar um objeto MyClass? MyClass.getInstance(); public MyClass { private MyClass() {} public static MyClass getInstance() { return new MyClass(); } } Singleton 20 Participantes do Padrão: Singleton Define a operação getInstance que permite que clientes acessem a instância única Define uma variável única uniqueInstance que irá guardar a instância Singleton 21 Implementação do Padrão (Java): Singleton 22 A figura mostra um diagrama de sequências que representa o processo de criação de um singleton. Quando um objeto chama o singleton pela primeira vez, é realizada a instanciação da classe. Os demais acessos irão utilizar a instância já criada. Exercício 23 1) Transforme a fábrica de chocolates em Singleton. (Especificação no AVA) Singleton 24 Trabalhando com segmentos... Singleton 25 Ao adicionar a palavra sincronizada a getInstance(), forçamos todo segmento a esperar sua vez antes de poder inserir o método. Ou seja, dois segmentos não podem inserir o método ao mesmo tempo. Singleton 26 O problema com o synchronized é que a sincronização é bastante dispendiosa. Estima-se que métodos sincronizados sejam cerca de cem vezes mais lentos que métodos não sincronizados. Singleton 27 Como melhorar o trabalho com vários segmentos? 1. Não faça nada se o desempenho de getInstance() não for crítico para o seu aplicativo 2. Utilize uma instância criada rapidamente ao invés de uma criada lentamente A instância é criada quando a classe é carregada, então toda vez o objeto é retornado Singleton 28 Como melhorar o trabalho com vários segmentos? Singleton 29 Como melhorar o trabalho com vários segmentos? 3. Usando a trava duplamente verificada Primeiro verificamos se uma instância foi criada e, se não, então sincronizamos. Assim sincronizamos apenas na primeira vez! Reduz drasticamente a sobrecarga! Singleton 30 Como melhorar o trabalho com vários segmentos? Garante que vários segmentos lidem com a variável! Singleton 31 Consequências: Acesso controlado a instância única Espaço de nomes reduzido Uma classe, duas responsabilidades Gerenciar sua própria instância Realizar a função principal em seu aplicativo Exercício 32 2) Transforme a fábrica de chocolate: A- faça sincronização B- utilize a criação rápida C- utilize a trava duplamente verificada
Compartilhar