Aula 7 – Padrão Abstract Factory

Slides:



Advertisements
Apresentações semelhantes
Aula 6 – Padrão Factory Method
Advertisements

Aula 7 – Padrão Abstract Factory
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.
Padrões de Projeto Aula 14 – Padrão Abstract Factory.
Tratamento de exceções em Java Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de.
CLASSES EM JAVA Dilvan Moreira (baseado no livro Big Java)
Disciplina:PROA3V José Henrique Verhalem e Renan Tenório Professor: Alexandre Cassimiro Novembro 2015.
Modelagem Orientada a Objetos com UML Cursos para a CTI - IME/USP Dairton Bassi, Hugo Corbucci e Mariana Bravo Departamento de Ciência.
Linguagem de Programação – Aula 03 Prof. Me. Ronnison Reges Vidal.
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Variáveis e Atribuições.
Classes Objetos Atributos Métodos Coletor de Lixo (Garbage Collector ) Confraria do Java Nivelamento. Caroline, Marcelo e Luiz 12/05/2007.
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal
Recursividade, Entrada pelo teclado e Funções com retorno
Diagrama de Sequencia Prof. Thales Castro.
Banco de Registradores e ALU
\\ Titulo do eBook Nome ou Marca da Empresa | Site | Midias Sociais.
UML – Diagramas de componentes
Germano Maioli Penello
QuickReview: Observer Definição:
Complementos de Engenharia de Software A linguagem VDM++ (4ª parte – Funções avançadas) João Pascoal Faria
PROGRAMAÇÃO ORIENTADA A OBJETO - JAVA
Linguagem C Para programadores Python
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
Adm.Industrial P.O. Aula 04 Aplicações Rafael Ferrara.
Aula 6 – Padrão Factory Method
Java: Interfaces Alcides Calsavara.
UNIDADE 1 A plataforma Moodle e suas ferramentas
Singleton e Template Method
Unidade IV– Relacionamento entre Objetos
Aula 14 – Padrão Abstract Factory
UML – Diagramas de Componentes e Modelação da Arquitectura Física
Adapter Definição: Quando usar? Tipo de padrão? Como?
Aula 11 – Padrão Singleton
Workshop Agile tdd - Test Driven development
Arquitetura de Computadores
Engenharia de Software II
Endereçamento IP.
Programação Orientada a Objetos
Intersecção e Reunião de Intervalos
Programação Orientada a Objetos
Desenvolvimento Androd Prof. Rone Ilídio
Diagramas de Sequência
Funções do Usuário em Matlab
Prof. Msc. Diovani Milhorim
Programação para Internet Rica
Método Simplex Montar um dicionário inicial
DESENVOLVIMENTO DE SOFTWARE AULA 6 – Programação Orientada a Objetos
Aula 8 – Padrão Singleton
Elaborando as Interfaces Aulas 37, 38 e 39.
Remote Method Invocation
DISTRIBUIÇÕES AMOSTRAIS
Interpretação Gráfica
Rosemary Silveira Filgueiras Melo
Rosemary Silveira Filgueiras Melo
Programação Orientada a Objetos
Laboratório I Mateus Raeder.
Laboratório I Mateus Raeder.
Trabalho de Conclusão de Curso I
Seu clube de amigos on-line!
Laboratório I Mateus Raeder.
Programação Funcional
Bem-vindo ao novo PowerPoint
Teste de Software 04: Que parte devo testar?
Ordenando Coleções A Classe Collections.
Modelagem de Sistemas
Prof. Ricardo Luís Lachi
Interface Java: JFrame, JPanel, JButton, JLabel, JMenuBar, Jmenu, JMenuItem, addSeparator() e a biblioteca Java.Math Prof. Esp. André Aparecido da Silva.
RESULUÇÃO DOS EXERCÍCIOS E
Dicas sobre Referencial Teórico
Percorrendo coleções com Iterator
Transcrição da apresentação:

Aula 7 – Padrão Abstract Factory Padrões de Projeto Aula 7 – 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. Padrões de Projeto - Abstract Factory

Padrão Abstract Factory Criando famílias de produtos com Abstract Factory. Padrões de Projeto - Abstract Factory

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? Padrões de Projeto - Abstract Factory 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.

Analisando as dependências dos objetos Um componente de alto nível que depende de componentes de mais baixo nível concretos se torna mais vulnerável a mudanças. Padrões de Projeto - Abstract Factory Aqui PizzaStore depende desses tipos de pizza pois instancia cada um deles manualmente! Assim que aparecer um novo sabor de pizza ou algum sair do cardápio, PizzaStore sofrerá alteração...

O princípio da Inversão de Dependência Dependa de abstrações. Não dependa de classes concretas. Padrões de Projeto - Abstract Factory Se dependermos de abstrações podemos extender o nosso programa, ou seja, adicionar novas entidades àquela abstração já existente sem precisar alterar o código.

Qual a grande diferença de um princípio para outro? Dependa de abstrações. Não dependa de classes concretas. Qual a grande diferença de um princípio para outro? versus Sempre programe para interfaces. Padrões de Projeto - Abstract Factory Perceba que o princípio “dependa de abstrações” é um pouco mais profundo do que o “programa para interfaces”. DependentPizzaStore programa para a interface Pizza, mas ainda depende das classes concretas pois as instancia. No primeiro exemplo, nós programamos para a interface Pizza! Mas ainda dependíamos das classes concretas para instanciar cada estilo de Pizza diferente.

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

Por que Inversão de Dependência? O que minha pizzaria pode retornar no método orderPizza()? 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. Padrões de Projeto - Abstract Factory Minha pizzaria vai fazer pizza! Depois eu decido os sabores!

Diretrizes para seguir o princípio da Inversão de Dependência Nenhuma variável deve conter uma referência a uma classe concreta; Isso só deveria ser aceitável nas fábricas... Nenhuma classe deve derivar de uma classe concreta; Se assim o fizer você dependerá de uma classe concreta. Derive de uma abstração, como uma interface ou uma classe abstrata; Nenhum método deve substituir um método implementado de uma de suas classes base; 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. Padrões de Projeto - Abstract Factory Nem sempre será possível seguir todas as diretrizes. Mas sempre que for possível, siga-as!

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. Padrões de Projeto - Abstract Factory

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

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(); } Padrões de Projeto - Abstract Factory

O padrão Abstract Factory Como implementar as diferenças regionais? Construir uma fábrica para cada região. Criar uma subclasse que implementa a interface da fábrica abstrata PizzaIngredientFactory, para cada região 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) Conectar as fábricas ao antigo código PizzaStore. Padrões de Projeto - Abstract Factory

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(); Padrões de Projeto - Abstract Factory

As pizzas agora são classes abstratas – um produto abstrato formado por um conjunto de componentes abstratos (interfaces que definem os ingredientes) 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 Padrões de Projeto - Abstract Factory

Uma pizza concreta é a implementação de uma Pizza abstrata 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(); Padrões de Projeto - Abstract Factory Os tipos de pizza podem ser regionalizados (particularizados) via a especificação de uma fábrica de ingredientes específica

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; Agora passamos para cada pizza a fábrica que será usada para fabricar seus ingredientes Padrões de Projeto - Abstract Factory 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.

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. RioTintoPizzaIngredientFactory JoaoPessoaPizzaIngredientFactory Padrões de Projeto - Abstract Factory Agora PizzaStore pode utilizar diferentes fábricas, para as diferentes franquias, e obter pizzas com ingredientes ligeiramente diferentes 

Workflow: pedido de pizza Primeiro, precisamos de uma PizzaStore: Agora que temos uma loja, podemos pedir a pizza; OrderPizza chama o método de fábrica createPizza: Quando o createPizza é chamado, o nosso PizzaIngredientFactory entra em ação: 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"); Padrões de Projeto - Abstract Factory 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(); }

Definição O padrão Abstract Factory fornece uma interface para criar família de objetos relacionados ou dependentes sem especificar suas classes concretas. Padrões de Projeto - Abstract Factory Vocês precisam entender essa definição. Se tiverem dúvidas me avisem.

Terminologia e Estrutura Padrões de Projeto - Abstract Factory Product  pizza ConcreteProduct  diferentes tipos de pizza Creator  loja abstrata/ pizzaStore ConcreteCreator  diferentes tipos de loja para cada região

Padrões de Projeto - Abstract Factory

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. http://www2.ic.uff.br/~anselmo/cursos/TPA/apresentacoes/PadraoFactoryMethod_AbstractFactory.pdf Padrões de Projeto - Abstract Factory