Aula 8 – Padrão Singleton

Slides:



Advertisements
Apresentações semelhantes
Soluções elegantes para problemas recorrentes
Advertisements

Modificadores Marco Antonio, Arquiteto de Software – TJDF Atualizado em Novembro/2008.
Modificadores Marco Antonio. Introdução Em todas as linguagens de programação o acesso a classes/métodos deve seguir algumas regras.
Java Básico Orientação a Objeto Marco Antonio Software Architect Fev/2008.
Abstract Factory Intenção: fornecer uma interface comum para a criação de famílias de objetos relacionados ou dependentes, sem especificar suas classes.
Singleton.
Padrões GoF – Factory Method
Walfredo Cirne walfredo.dsc.ufpb.br
Diagrama de Classes.
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Classes e objetos P. O. O. Prof. Grace.
Classes, Objetos e Encapsulamento
Unidade I: “Dê um mergulho rápido”
Programação Orientada a Objetos com Java
Monitores.
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 13 Orientação a Objetos – C++ Parte 1
Singleton e Adapter Professor: Nazareno Andrade
Tópicos avançados em internet A
Programação I Aula 2 (Métodos)
Classes, Objetos, Atributos e Métodos JAVA
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Programação Orientada à Objetos
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Membro Static.
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Como criar uma Classe e.
ARQUITETURA DE COMPUTADORES II
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Ruby (2/2) André Braga Patrícia Lustosa. Intro Peguem a aula de ontem em /~plvr para ter como referência para os exercícios de hoje.
Semáforos J2SE 5.0 Estudo da API e comparação com definição clássica Gustavo Frainer Rômulo Rosinha
Transações Concorrentes
Introdução às Java Threads
Aula Prática 4 Monitoria IP/CC (~if669).
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Aula prática 3 Aprofundando em Funções Parâmetros de uma função Uso do return Execução Variáveis Global, local e estática Monitoria de Introdução à.
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
April 05 Prof. Ismael H. F. Santos - 1 Módulo III Padrões GOF: Singleton, Professores Eduardo Bezerra –
Recursividade Profs. De Prog2 e Lab2.
Padrões de Projeto Abstract Factory.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Novidades... Quartetos; – Equilibrar Conhecimento; – Aprender a Ensinar; – Trabalho em Equipe; – Facilitar a Vida do Professor. – Então, definam seus grupos.
1 Design Pattern Double Checked Locking. 2 Design Pattern Apresenta soluções para problemas que ocorrem repetidamente em nosso ambiente computacional.
Design Patterns A adoção dos padrões terá um efeito profundo e duradouro sobre a forma de escrevermos programas Ward Cunningham e Ralph Johnson.
Conceitos do Cliente Funcionamento Básico do Cliente Como Clientes acessam e usam Objetos Distribúidos.
Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador.
2 – Revisão de Programação Orientada a Objetos
2 – Revisão de Programação Orientada a Objetos
Padrões de Projeto Aula 3 – Padrão Strategy.
Padrões de Projetos Professora Lucélia. Conceitos É uma solução conhecida para um problema comum São técnicas que nos dão uma boa solução para determinados.
REDES DE COMPUTADORES II
Aula 5 – Padrão Decorator
Aula 6 – Padrão Factory Method
Padrões de Projeto Aula 9 – Padrão Adapter.
Aula 7 – Padrão Abstract Factory
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
Padrões de Projeto 2 – Revisão de Programação Orientada a Objetos.
Padrões de Projeto de Criação Padrões de Projeto Orientados a Objetos Prof a. Danielle Martin Universidade de Mogi das Cruzes.
1 Introdução aos Padrões de Projetos (na prática) Créditos: Lúbia Vinhas Hazel Carvalho Crato Adaptações: Prof. Nécio de Lima Veras.
SOCKET - É um canal de comunicação entre processos que estabelece uma conexão entre eles na forma de cliente-servidor. Por meio de sockets, os computadores.
Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Sistemas Operacionais IESP - FATEC-PB Professor: Gustavo Wagner.
Herança em Java Curso: Informática Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Testes de Unidade. 2 Pauta Testes de Unidade; Testes de Unidade; Desenvolvimento orientado a testes; Desenvolvimento orientado a testes; Testes unitários.
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Padrões de Projeto Aula 14 – Padrão Abstract Factory.
Padrões de Projeto Aula 5 – Padrão Decorator 1. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? 2.
Padrões de Projeto Aula 12 – Padrão Adapter. PADRÃO ADAPTER Soluções simples para problemas reais! 2.
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Façade Definição: Quando usar? Tipo de padrão? Como? estrutural.
Aula 11 – Padrão Singleton
Aula 8 – Padrão Singleton
Transcrição da apresentação:

Aula 8 – Padrão Singleton Padrões de Projeto Aula 8 – Padrão Singleton

Definição (Abstract Factory) Fornece uma interface para criar família de objetos relacionados sem especificar suas classes concretas. Quando usar? Quando precisar criar fábricas concretas mas ainda desconhecidas (ex.: fábrica de ingredientes de JP) para criar famílias de produtos concretos mas ainda desconhecidos (ex.: ingredientes como queijo coalho). Tipo de padrão? De criação Como implementar? Padrões de Projeto - Singleton

Padrões de Projeto - Singleton

Padrão Singleton When ONE is ENOUGH! coisa única Padrões de Projeto - Singleton

Definição O padrão Abstract Singleton garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela. Padrões de Projeto - Singleton Hoje começaremos pela definição.

When is one enough? Geralmente, quando um recurso global é compartilhado; Aplicações multi-threaded; Aplicações que acessam dados externos banco de dados; impressora; driver de dispositivo; Também é bastante utilizado para logging, caching, pools de threads, preferências e configurações de sistemas, etc. Banco de dados: geralmente é utilizada apenas uma conexão com o banco, porque uma é suficiente, para a maioria das aplicações. Muitas conexões podem tornar a aplicação lenta; Logging: apenas um OutputStream é necessário para “loggar” em um arquivo… Impressão: apenas um spooler de impressão é necessário, não importando a quantidade de clientes que o utilizem… Padrões de Projeto - Singleton

Como garantir uma única instância? Como você criaria um único objeto? E se outro objeto quisesse criar um MyObject? Poderia chamar new em MyObject de novo? Então, se tivermos uma classe, sempre poderemos instanciá-la uma ou mais vezes? E se não for? new MyObject(); Sim, claro. Sim, mas só se for uma classe pública. Se não for pública, apenas as classes do mesmo pacote poderão instanciá-la mais de uma vez. Padrões de Projeto - Singleton

Como garantir uma única instância? Vocês sabiam que isso é possível? O que isto significa? Então, quem poderia usar esse construtor? Por que não? Nunca havíamos pensado a respeito. Mas parece ser possível. Parece ser uma classe que não pode ser instanciada porque o construtor é private. Hmm... Qualquer código dentro de MyClass tem acesso e pode chamar esse construtor privado. Mas isso não faz muito sentido. Porque seria preciso ter uma instância da classe para chamá-lo. Mas como essa primeira instância é criada? public class MyClass{ private MyClass(){} } Padrões de Projeto - Singleton

Como garantir uma única instância? E se MyClass tivesse um método static? Hmmmmmmmm... Assim nós conseguimos usar getInstance e usar o construtor privado para pegar o objeto. public class MyClass{ private MyClass(){} public static MyClass getInstance(){ return new MyClass(); } Padrões de Projeto - Singleton Mas como garantir que somente UMA única instância (singleton) de MyClass seja criada? Hands on!

Implementação clássica Agora chamamos MyClass de Singleton Temos uma variável estática para conter nossa única instância da classe Singleton public class Singleton{ private static Singleton uniqueInstance; //other variables private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance==null) uniqueInstance = new Singleton(); return uniqueInstance; } //other methods Nosso construtor é privado. Apenas Singleton tem acesso a ele. Padrões de Projeto - Singleton Singleton é uma classe normal, e por isso tem outras variáveis que não a que contém a instância de Singleton, bem como também contem outros métodos. Por ser estático, getInstance é a nossa única maneira de conseguirmos uma instância de Singleton. Nele colocamos um código que permite uma única instanciação da classe Singleton.

Implementação clássica Note que essa é a lazyInitialization (instanciação preguiçosa). O objeto só é criado quando alguma classe chama getInstance. Mais adiante veremos outros tipos de inicialização. uniqueInstance contém nossa única instância; lembre-se é uma variável estática public class Singleton{ private static Singleton uniqueInstance; //other variables private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance==null) uniqueInstance = new Singleton(); return uniqueInstance; } //other methods Se uniqueInstance é nulo então é porque ainda não criamos a instância Padrões de Projeto - Singleton E caso não exista, o instanciamos através de seu construtor privado Se uniqueInstance não for nula é porque já foi criada. Então, apenas retornamos uniqueInstance.

Padrões de Projeto - Singleton

Padrões de Projeto - Singleton Quando ele fala solteiro, no livro em inglês ele diz single. Traduziram errado. Solteiro, aí, quer dizer único. 

Ex.: a Fábrica de Chocolate Padrões de Projeto - Singleton

Ex.: a Fábrica de Chocolate Padrões de Projeto - Singleton private static ChocolateBoiler uniqueInstance; Constructor: private; public static ChocolateBoiler getInstance(){ if(uniqueInstance==null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; }

Terminologia e Estrutura getInstance() é static, ou seja, podemos acessá-lo de qualquer outra classe uniqueInstance contém a única instância de Singleton Padrões de Projeto - Singleton Singleton deve ter um construtor private. Lembre-se disto. Uma classe que implementa o padrão Singleton é mais do que um Singleton; é uma classe de fins gerais com seu conjunto de dados e métodos

Exemplo com Thread Uma máquina multi-core, executanto o programa da Fábrica de chocolate com duas threads chamando getInstance()… Analise o valor de uniqueInstance ao longo do tempo. Thread 1 Thread 2 public static ChocolateBoiler getInstance(){ if(uniqueInstance==null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; } Padrões de Projeto - Singleton tempo

Problemas com Multithreading Quando há multithreading o método getInstance() poderia ser chamado mais ou menos no mesmo instante, o que resultaria em mais de uma instância sendo criada; Possíveis soluções: Sincronizar o método getInstance() Utilizar a estratégia de eager initialization ao invés de lazy initialization Usar a trava duplamente verificada para reduzir o uso da sincronização em getInstance() Padrões de Projeto - Singleton

Sincronizando getInstance() public static synchronized ChocolateBoiler getInstance(){ if(uniqueInstance==null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; } Desvantagem: pode diminuir o desempenho do programa por um fator de 100; Se o desempenho de getInstance não for crítico para o seu aplicativo, essa pode ser uma boa saída. Padrões de Projeto - Singleton Explicar o synchronized explicando que o lock é como se fosse uma chave, e a thread só poderá executar aquele trecho de código quando estiver em posse da chave.

ansioso, apressado Eager Initialization public class Singleton{ private static Singleton uniqueInstance = new Singleton(); //other variables private Singleton(){} public static Singleton getInstance(){ return uniqueInstance; } //other methods Padrões de Projeto - Singleton Útil se você sabe que seu programa sempre cria e usa uma instância Singleton. O construtor será chamado na primeira vez que a classe for carregada, ou seja, quando você tentar executar algum método (não necessariamente o getInstance) da classe em questão.

Trava duplamente verificada public class Singleton{ private volatile static Singleton uniqueInstance; //other variables private Singleton(){} public static Singleton getInstance(){ if(uniqueInstance==null){ synchronized(Singleton.class){ if(uniqueInstance==null) uniqueInstance = new Singleton(); } return uniqueInstance; //other methods Garante que várias threads lidem com a variável uniqueInstance corretamente Procure uma instância, e se não houver uma, insira um bloco sincronizado Observe que sincronizamos, apenas na primeira vez (criação). Uma vez no bloco, verifique de novo, e, se ainda for null, crie uma instância. Padrões de Projeto - Singleton Diminui o overhead imposto pela sincronização entre as threads (synchronized)

Resumo Permite que exista apenas UMA instância da “classe Singleton”; Provê um ponto de acesso único e global; É implementado declarando o contrutor private e um método static combinado com uma variável static; É preciso tomar cuidado quando há mais de uma thread criando a instância Singleton. Há três formas de resolver esse problema, cada uma com sua peculiaridade (vantagens e desvantagens): Declarando getInstance() como synchronized; Eager initialization; Trava duplamente verificada. Padrões de Projeto - Singleton

Referências [1] O cenário de pizzarias é abordado no capítulo 5 do livro “Padrões de Projeto – Use a Cabeça!” Padrões de Projeto - Singleton