padrões de projeto aula 7 – padrão abstract factory

25
Padrões de Projeto Aula 7 – Padrão Abstract Factory

Upload: maria-das-neves-suzana-ramalho-palha

Post on 07-Apr-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padrões de ProjetoAula 7 – Padrão Abstract Factory

Page 2: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

• 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.

Page 3: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

PADRÃO ABSTRACT FACTORY

Criando famílias de produtos com Abstract Factory.

Page 4: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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.

Page 5: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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.

Page 6: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

O princípio da Inversão de Dependência

Dependa de abstrações. Não dependa de classes concretas.

Page 7: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

Dependa de abstrações. Não dependa de classes concretas.

Sempre programe para interfaces.

versusQual 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.

Page 8: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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.

Page 9: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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!

Page 10: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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!

Page 11: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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.

Page 12: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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

Page 13: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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(); }

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

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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ão2. 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.

Page 15: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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();}

}

Page 16: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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)

Page 17: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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

Page 18: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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 elsesreturn 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

Page 19: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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

Agora PizzaStore pode utilizar diferentes fábricas, para as diferentes franquias, e obter pizzas com ingredientes ligeiramente diferentes

Page 20: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Workflow: pedido de pizza1. 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:

Padr

ões d

e Pr

ojet

o - A

bstr

act

Fact

ory

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();

}

Page 21: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

Definição

O padrão Abstract Factory fornece uma interface para criar família de objetos

relacionados ou dependentes sem especificar suas classes concretas.

Page 22: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

Terminologia e Estrutura

Page 23: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

Page 24: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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.

Page 25: Padrões de Projeto Aula 7 – Padrão Abstract Factory

Padr

ões d

e Pr

ojet

o - A

bstr

act F

acto

ry

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