Padrões de Projeto Aula 14 – Padrão Abstract Factory.

Slides:



Advertisements
Apresentações semelhantes
Classes Abstratas e Interfaces
Advertisements

Modificadores Marco Antonio. Introdução Em todas as linguagens de programação o acesso a classes/métodos deve seguir algumas regras.
Projeto de Sistemas de Software
Factory Method Projeto de Sistemas de Software
Abstract Factory Intenção: fornecer uma interface comum para a criação de famílias de objetos relacionados ou dependentes, sem especificar suas classes.
Padrões GoF – Factory Method
Polimorfismo e Classes Abstratas Profa
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Interfaces em Java1 Interfaces Prof. Ricardo Linden.
Herança e Polimorfismo
Programação Orientada a Objetos com Java
Padrões de projeto detalhados Factory Method, Abstract Factory
Singleton e Adapter Professor: Nazareno Andrade
Professora Lucélia Oliveira
Pilhas Profa. Nádia Félix.
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Acoplamento e Coesão Modelagem e Programação Orientada a Objetos
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Classes e Objetos em Java.
Curso de Aprendizado Industrial Desenvolvedor WEB
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Aula Prática 4 Monitoria IP/CC (~if669).
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Classes Abstratas e Interface
Modelando Sistemas em UML
Classes Abstratas e Interfaces GX – Aula05 1.
Padrões de Projeto Abstract Factory.
Bruno Inojosa MCP .NET Framework
Factory.
Aula 6 – Padrão Factory Method
Padrões de Projeto Aula 9 – Padrão Adapter.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Aula 7 – Padrão Abstract Factory
Aula 8 – Padrão Singleton
Funções Financeiras Parte 2. TAXA INTERNA DE RETORNO (TIR)  A Taxa Interna de Retorno (TIR) é outra medida de investimento, porém, diferentemente do.
Aula 5 Bioestatística. Estatísticas para uma variável.
Jean Carlo mendes
Guia de referência para utilização do autorizador.
Introdução POO Thiago Medeiros Sistemas de Informação Definição: Sistemas de Informação é uma combinação de pessoas, dados, processos, redes de.
1. 2 Programação Orientada a Objetos Prof. Maurício Rodrigues de Morais
Modelagem de Dados Aula 1.
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.
© 2013 Pearson. Todos os direitos reservados.slide 1 Capítulo 8 Identificação de segmentos de mercado e seleção de mercados-alvo.
1. 2 Programação Orientada a Objetos Prof. Maurício Rodrigues de Morais
Aula 5. Teste de Hipóteses II. Capítulo 12, Bussab&Morettin “Estatística Básica” 7ª Edição.
6º GBM - Nova Friburgo - Setembro 2011
GRASP: Projeto de Objetos com Responsabilidade. 2 Pauta Responsabilidades e métodos Responsabilidades e métodos Padrões Padrões GRASP: Padrões e princípios.
INE5408 Estruturas de Dados Introdução a Árvores - Conceitos - Árvores Binárias - Métodos e algoritmos de percurso - Métodos e algoritmos de balanceamento.
Noções de projeto orientado a objetos - camadas Prof. Gustavo Wagner (alterações) Prof. Tiago Massoni (Slides originais) Desenvolvimento de Sistemas FATEC-PB.
Programação para Internet Aula 06 Linguagem Java (Orientação a Objetos – Atributos e Métodos)
Classes Abstratas e Interface. 2 Classe Abstrata  Uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos);
1 Interface (o termo) » Interface (a palavra reservada): Java estendeu o conceito de interfaces à um nível ainda mais flexível que permite construir entidades.
Sabe quem está chegando? A família Real de Marte, uma simpática família extra-terrestre. E sabe o que eles acharam de mais intrigante em suas primeiras.
Polimorfismo com Interfaces Pacotes em Java Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB.
Herança em Java Curso: Informática Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Normalização (4FN) Na literatura aparecem outras formas normais, como a forma normal de Boyce/Codd, a 4FN e a 5FN. Destas a única que tem importância na.
AULA Mais Herança Curso: Informática (Subseqüente) Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Herança e Polimorfismo Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de Informática,
Lógica de programação Estruturas de seleção Estruturas de repetição Sub-Rotinas 1.
HERANÇA E POLIMORFISMO Dilvan Moreira (baseado no livro Big Java e T. Munzner)
Padrões de Projeto Aula 15 – Padrão Command. PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2.
Prof. Thales Castro.  Breve revisão  Diagramas de Classe.
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Calculo de Hoare Daniel Soares, Gabriel Alabarse Hernandez(150756) e Vanius Zapalowski(150843)
PROGRAMAÇÃO FUNCIONAL COM SCALA Leonardo Lucena IFRN
CLASSES EM JAVA Dilvan Moreira (baseado no livro Big Java)
DEZ DICAS DE ATENDIMENTO
Aula 5 - Métodos. Desenvolvimento de Programas A melhor forma de construir programas grandes é dividi-los em programas menores que executam tarefas específicas.
Aula 7 – Padrão Abstract Factory
Aula 14 – Padrão Abstract Factory
Transcrição da apresentação:

Padrões de Projeto Aula 14 – Padrão Abstract Factory

QuickReview: Factory Method O que é uma SimpleFactory? – É uma fábrica simples que cria produtos, e cujo principal objetivo é localizar alteração de código relativo à criação em uma única classe. Definição (Factory Method) – Define uma interface para criação de objetos (factory method, método abstrato), mas permite as classes decidir qual classe instanciar. No Factory Method, a instanciação é delegada para subclasses. Quando usar? – O padrão deve ser utilizado quando uma classe precisa instanciar subclasses de uma classe X que ainda não foram definidas (as subclasses) Tipo de padrão? – De criação Como implementar? – Uma classe criadora terá o factory method, um método abstrato. Criadores concretos (subclasse da classe criadora) fornecerão a implementação do factory method e instanciarão produtos concretos, subtipo de produto (que é uma abstração). – Para melhor entendimento, ver terminologia e estrutura uml. 2

PADRÃO ABSTRACT FACTORY Criando famílias de produtos com Abstract Factory. 3

Analisando as dependências dos objetos Se nós esquecermos por um momento o conceito de fábricas... Como fica o grau de dependência entre as classes de uma solução que não se baseia em padrões? Quando instanciamos objetos diretamente, dependemos de sua classe concreta; DependentPizzaStore está criando os objetos diretamente ao invés de delegar essa função a uma factory. 4

Analisando as dependências dos objetos 5

O princípio da Inversão de Dependência Dependa de abstrações. Não dependa de classes concretas. 6

Sempre programe para interfaces. versus Qual a grande diferença de um princípio para outro? No primeiro exemplo, nós programamos para a interface Pizza! Mas ainda dependíamos das classes concretas para instanciar cada estilo de Pizza diferente. 7

Aplicando o princípio da Inversão de Dependência agora PizzaStore tem um factory method, que só retorna Pizza (abstração) anteriormente PizzaStore instanciava vários tipos de Pizza “na mão”. Dependia de classes concretas e não de abstrações. 8

Por que Inversão de Dependência? Tem a ver com a forma com que pensamos no projeto; A ordem convencional seria pensar na pizzaria, e posteriormente, nos tipos de pizza que serão vendidos (margherita, moussarela, franpiry); Mas e se invertermos e pensarmos nas classes concretas identificando o que pode ser abstraído (o conceito de Pizza)? Então, PizzaStore passa a se preocupar somente com o conceito abstrato de Pizza e não nas versões concretas; Mas pra isso precisamos liberar PizzaStore da instanciação direta de classes concretas; O objetivo é que PizzaStore dependa da abstração (pizza). Factory Method é um padrão que resolve esse problema, mas não o único. O que minha pizzaria pode retornar no método orderPizza()? Minha pizzaria vai fazer pizza! Depois eu decido os sabores! 9

Diretrizes para seguir o princípio da Inversão de Dependência 1.Nenhuma variável deve conter uma referência a uma classe concreta; 1.Isso só deveria ser aceitável nas fábricas... 2.Nenhuma classe deve derivar de uma classe concreta; 1.Se assim o fizer você dependerá de uma classe concreta. Derive de uma abstração, como uma interface ou uma classe abstrata; 3.Nenhum método deve substituir um método implementado de uma de suas classes base; 1.Se você substituir um método implementado, sua classe de base não era realmente uma abstração pela qual começar. Esses métodos implementados na classe de base devem ser compartilhados por todas as suas subclasses. Nem sempre será possível seguir todas as diretrizes. Mas sempre que for possível, siga-as! 10

Voltando às Pizzarias Sapore Notamos que algumas franquias tomaram a liberdade de usar alguns ingredientes mais baratos para aumentar os lucros... Como evitar esse problema? Vamos fornecer uma fábrica que produz os ingredientes para as PizzaStores! Problema: cada franquia usa suas próprias variações locais de ingredientes apesar da receita da pizza ser a mesma: massa, molho, queijo, etc. 11

Famílias de ingredientes Rio Tinto João Pessoa Campina Grande Marisco fresco Molho marinara Massa fina e crocante Queijo Cheddar Marisco congelado Molho de tomate Massa grossa e crocante Queijo Mussarela Marisco na concha Molho Bruschetta Massa muito fina e crocante Queijo de cabra 12

O padrão Abstract Factory Vamos definir uma fábrica abstrata, ou seja, uma interface que indica quais ingredientes devem ser produzidos para criar uma pizza: public interface PizzaIngredientFactory { public Massa criaMassa(); public Molho criaMolho(); public Queijo criaQueijo(); public Vegetais[] criaVegetais(); public Pepperoni criaPepperoni ); public Marisco criaMariscos(); } 13

O padrão Abstract Factory Como implementar as diferenças regionais? 1.Construir uma fábrica para cada região. Criar uma subclasse que implementa a interface da fábrica abstrata PizzaIngredientFactory, para cada região 2.Implementar os ingredientes que serão usados em cada fábrica. Criar um conjunto de classes filhas para cada classe abstrata (QueijoCheddar, MolhoMarinara, MassaFina, etc) 3.Conectar as fábricas ao antigo código PizzaStore. 14

Construindo a fábrica de ingredientes de Rio Tinto public class RioTintoPizzaIngredientFactory implements PizzaIngredientFactory { public Massa criarMassa(){ return new MassaFinaCrocante(); } public Molho criarMolho(){ return new MolhoMarinara; } public Queijo criarQueijo(){ return new QueijoCheddar(); } public Vegetal[] criaVegetais(){ return new Vegetal[]{new Cebola(), new Alho()}; } public Pepperoni criaPepperoni(){ return new PepperoniApimentado(); } public Marisco criaMariscos(){ return new MariscoFresco(); } 15

public abstract class Pizza{ protected String nome; protected Massa massa; protected Molho molho; protected Queijo queijo; protected Marisco mariscos; protected Vegetal[] vegetais; protected Pepperoni pepperoni; protected int tempoDeForno, temperatura, fatias; public abstract void preparar(); public void cozinhar(){ System.out.println("Cozinhando a "+temperatura+" graus por "+tempoDeForno+" minutos"); } public void fatiar(){ System.out.println("Fatiando em "+fatias+" pedacos."); } public void embalar(){ System.out.println("Embalando na caixa oficial da Sapore."); } //setNome, getNome, toString } As pizzas agora são classes abstratas – um produto abstrato formado por um conjunto de componentes abstratos (interfaces que definem os ingredientes) 16

public class PizzaDeMarisco extends Pizza{ private PizzaIngredientFactory ingredientFactory; public PizzaDeMarisco(PizzaIngredientFactory factory){ this.ingredientFactory = factory; } public void preparar(){ System.out.println("Preprarando "+nome+"..."); massa = ingredientFactory.criarMassa(); molho = ingredientFactory.criarMolho(); queijo = ingredientFactory.criarQueijo(); mariscos = ingredientFactory.criarMariscos(); } Uma pizza concreta é a implementação de uma Pizza abstrata Os tipos de pizza podem ser regionalizados (particularizados) via a especificação de uma fábrica de ingredientes específica 17

public class RioTintoPizzaStore extends PizzaStore{ protected Pizza criarPizza(String sabor){ PizzaIngredientFactory ingredientFactory = new RioTintoPizzaIngredientFactory(); Pizza pizza = null; if(sabor.equals("queijo")){ pizza = new PizzaDeQueijo(ingredientFactory); pizza.setNome("Pizza de Queijo no estilo RT"); }else if(sabor.equals("marisco")){ pizza = new PizzaDeMarisco(ingredientFactory); pizza.setNome("Pizza de Marisco no estilo RT"); } //more if elses return pizza; } Assim como no padrão Method Factory, no padrão Abstract Factory nós também usamos o método de fábrica. Cada nova loja deve estender PizzaStore e fornecer uma AbstractFactory diferente para cada região. Agora passamos para cada pizza a fábrica que será usada para fabricar seus ingredientes 18

O que fizemos até agora? Este é o nosso PizzaIngredientFactory: uma família de ingredientes A partir da fábrica abstrata, criamos algumas fábricas concretas. RioTintoPizzaIngredient Factory JoaoPessoaPizzaIngredi entFactory Agora PizzaStore pode utilizar diferentes fábricas, para as diferentes franquias, e obter pizzas com ingredientes ligeiramente diferentes 19

Workflow: pedido de pizza 1.Primeiro, precisamos de uma PizzaStore: 2.Agora que temos uma loja, podemos pedir a pizza; 3.OrderPizza chama o método de fábrica createPizza: 4.Quando o createPizza é chamado, o nosso PizzaIngredientFactory entra em ação: 5.Depois, precisamos preparar a pizza. Uma vez que o método preparar() entra em ação, a fábrica é solicitada para preparar os ingredientes: PizzaStore rtPizzaStore = new RioTintoPizzaStore(); rtPizzaStore.orderPizza("mariscos"); Pizza pizza = createPizza("mariscos"); Pizza pizza = new PizzaDeMarisco(rtPizzaIngredientFactory); public void preparar(){ System.out.println("Preprarando "+nome+"..."); massa = ingredientFactory.criarMassa(); molho = ingredientFactory.criarMolho(); queijo = ingredientFactory.criarQueijo(); mariscos = ingredientFactory.criarMariscos(); } 20

Definição O padrão Abstract Factory fornece uma interface para criar família de objetos relacionados ou dependentes sem especificar suas classes concretas. 21

Terminologia e Estrutura 22

23

Para a próxima aula Tarefa de casa (entregar próxima aula): ler páginas 115 – 117 e entender e descrever as diferenças entre Method Factory e Abstract Factory. 24

Referências – [1] O cenário de pizzarias é abordado no capítulo 4 do livro “Padrões de Projeto – Use a Cabeça!” – [2] Técnicas de Programação Avançada, Prof. Anselmo Montenegro. FactoryMethod_AbstractFactory.pdf FactoryMethod_AbstractFactory.pdf 25