Baixe o app para aproveitar ainda mais
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] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Compartilhar