Buscar

Aula 02 projetos importante

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 30 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 30 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 30 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

PADRÕES DE PROJETO DE SOFTWARE
Aula 2 – Padrões de criação GoF
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
O que veremos nesta segunda aula
Conhecer os padrões de criação Builder, Prototype e Singleton;
Aprender as principais aplicações e funcionalides destes padrões;
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Classificação dos padrões GoF segundo Metsker [2]
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Builder
"Separar a construção de um objeto complexo de sua representação para que o mesmo processo de construção possa criar representações diferentes." 
[GoF]
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Quando usar?
Builder permite que uma classe se preocupe com apenas uma parte da construção de um objeto. É útil em algoritmos de construção complexos
Use-o quando o algoritmo para criar um objeto complexo precisar ser independente das partes que compõem o objeto e da forma como o objeto é construído
Builder também suporta substituição dos construtores, permitindo que a mesma interface seja usada para construir representações diferentes dos mesmos dados
Use quando o processo de construção precisar suportar representações diferentes do objeto que está sendo construído
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo
… 
String configuracao; // informar todos os dados necessários
PedidoBuilder builder;
Pedido pedido;
builder = new pedidoBuilder(configuracao);
builder.buildPedido();
pedido = builder.getPedido();
// Listar atributos 
System.out.println(pedido.getNumero);
… 
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public abstract class ConversorTexto {
 public void converterCaractere(char c) {
 // vazio
 }
 public void converterParagrafo() {
 // vazio
 }
 public void converterFonte(Fonte f) {
 // vazio
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class ConversorPDF extends ConversorTexto {
 public void converterCaractere(char c) {
 System.out.print("Caractere PDF");
 }
 public void converterParagrafo() {
 System.out.print("Parágrafo PDF");
 }
 public void converterFonte(Fonte f) {
 System.out.print("Fonte PDF");
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class ConversorTeX extends ConversorTexto {
 public void converterCaractere(char c) {
 System.out.print("Caractere Tex");
 }
 public void converterParagrafo() {
 System.out.print("Paragrafo Tex");
 }
 public void converterFonte(Fonte f) {
 System.out.print("Fonte Tex");
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class ConversorASCII extends ConversorTexto {
 public void converterCaractere(char c) {
 System.out.print("Caractere ASCII");
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class LeitorRTF {
 private ConversorTexto conversor;
 LeitorRTF(ConversorTexto c) { this.conversor = c; }
 public void lerRTF() {
 List<Token> tokens = obterTokensDoTexto();
 for (Token t : tokens) {
 if (t.getTipo() == Token.Tipo.CARACTERE) {
 conversor.converterCaractere(t.getCaractere()); }
 if (t.getTipo() == Token.Tipo.PARAGRAFO) { 
 conversor.converterParagrafo(); }
 if (t.getTipo() == Token.Tipo.FONTE) {
 conversor.converterFonte(t.getFonte()); }
 }
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class Cliente {
 public static void main(String[] args) {
 ConversorTexto conversor;
 if (args[0].equals("pdf")) {
 conversor = new ConversorPDF();
 } else if (args[0].equals("tex")) {
 conversor = new ConversorTeX();
 } else { conversor = new ConversorASCII(); }
 LeitorRTF leitor = new LeitorRTF(conversor);
 leitor.lerRTF();
 }
 }
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Prototype
"Especificar os tipos de objetos a serem criados usando uma instância como protótipo e criar novos objetos ao copiar este protótipo." 
[GoF]
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Problema
Criar um objeto novo, mas aproveitar o estado previamente existente em outro objeto
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Estrutura do Prototype
Criar um objeto novo, mas aproveitar o estado previamente existente em outro objeto
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
… 
Carro novo = new Carro (“Branco”, “ABC1290XZA”, 2011, “A3”);
Carro clonado = novo.clone();
… 
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public abstract class Documento implements Cloneable {
 protected Documento clone() {
 Object clone = null;
 try {
 clone = super.clone();
 } catch (CloneNotSupportedException ex) {
 ex.printStackTrace();
 }
 return (Documento) clone;
 }
}
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class ASCII extends Documento { }
public class PDF extends Documento { }
public class Cliente {
 static final int DOCUMENTO_TIPO_ASCII = 0;
 static final int DOCUMENTO_TIPO_PDF = 1;
 private Documento ascii = new ASCII();
 private Documento pdf = new PDF();
 public Documento criarDocumento(int tipo) {
 if (tipo==Cliente.DOCUMENTO_TIPO_ASCII) {
 return ascii.clone();
 } else { return pdf.clone(); }
 }
}
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Singleton
"Garantir que uma classe só tenha uma única instância, e prover um ponto de acesso global a ela." 
[GoF]
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Problema 1
Garantir que apenas um objeto exista, independente do número de requisições que receber para criá-lo
Aplicações
Um único banco de dados
Um único acesso ao arquivo de log
Um único objeto que representa um vídeo
Uma única fachada (Façade pattern)
Poderia-se usar um membro estático ...
... e perder o encapsulamento
... e perder a flexibilidade de usar objetos
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Problema 2
Objetivo: garantir que uma classe só tenha uma instância. Questões:
Como controlar (contar) o número de instâncias da classe?
Como armazenar a(s) instância(s)?
Como controlar ou impedir a construção normal? Se for possível usar new e um construtor para criar o objeto, há como limitar instâncias?
Como definir o acesso à um número limitado de instâncias (no caso, uma apenas)?
Como garantir queo sistema continuará funcionando se a classe participar de uma hierarquia de classes?
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Prós e contras
Vantagens
Acesso central e extensível a recursos e objetos
Pode ter subclasses* (o que seria impossível se fosse apenas usada uma classe com métodos estáticos)
Desvantagens
Qualidade da implementação depende da linguagem
Difícil de testar (simulações dependem de instância extra)
Uso (abuso) como substituto para variáveis globais
Criação "preguiçosa" é complicada em ambiente multithreaded
Difícil ou impossível de implementar em ambiente distribuído (é preciso garantir que cópias serializadas refiram-se ao mesmo objeto)
* Mas é complicado: requer controle em todas as subclasses para garantir instância única (pelo menos um construtor precisa ser acessível às subclasses em Java) - use encapsulamento de pacote.
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Resumo
Singletons são uma forma de implementar uma responsabilidade centralizada
Garante que uma classe só tenha uma instância
Oferece um ponto de acesso global
O instanciamento do objeto pode ser feito quando a classe for carregada ou quando o método de criação for chamado pela primeira vez
Neste caso, é preciso garantir que outros objetos não tentarão criar outro Singleton declarando o bloco crítico com synchronized.
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class Singleton {
 private static Singleton instance;
// Adicione aqui classes aninhadas ou atributos private
 private Singleton() {
 }
 public static synchronized Singleton getInstance() {
 if (instance == null)
 instance = new Singleton();
 return instance;
 }
// implemente os demais métodos necessários (get e set)
}
 
PADRÕES DE CRIAÇÃO GOF– AULA 2
PADRÕES DE PROJETO DE SOFTWARE
Bibliografia
Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos - 3ª Edição
Autor: Larman, Craig
Padrões de Projeto: soluções reutilizáveis de software orientado a objetos
Autor: Gamma, Erich ... [et al]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Outros materiais