Abstract

15

Click here to load reader

Transcript of Abstract

Page 1: Abstract

ABSTRACTFACTORY

Alan O. De Sousa

Rafael B. Cabral

Page 2: Abstract

O que é o Abstract Factory?

• O Abstract Factory é um padrão de projeto semelhante ao Factory Method ;

• O Factory Method quer que você seja diferente (via herança) para criar objetos diferentes, o Abstract Factory quer que você tenha algo diferente.

• Abstract Factory permite satisfazer a restrição de criar apenas objetos relacionados ou dependentes

Page 3: Abstract

Diagrama de Classes

Page 4: Abstract

Exemplo de Código Abstract Factory//abstract factory

abstract AbstractFactory

{

public abstractBotao criarBotao();

public abstractJanela criarJanela();

}

//concrete factory

class MotifFactory extends AbstractFactory

{

public Botao criarBotao()

{

return newBotaoMotif();

}

public Janela criarJanela()

{

return newJanelaMotif();

}

}

Page 5: Abstract

//concrete factory

class MetalFactory extends AbstractFactory{

publicBotao criarBotao() {

return new BotaoMetal();

}

publicJanela criarJanela() {

return new JanelaMetal();

}

}

//abstract product

abstract class Botao {

public abstract void desenhar();

}

Page 6: Abstract

//product

class BotaoMotif extends Botao

{

public void desenhar() {

System.out.println("Eu sou um botao Motif!");

}

}

//product

class BotaoMetal extends Botao {

public void desenhar() {

System.out.println("Eu sou um botao do Metal!");

}

}

//abstract product

abstract class Janela

{

public abstract void desenhar();

}

Page 7: Abstract

//product

class JanelaMotif extends Janela

{

public void desenhar() {

System.out.println("Eu sou uma janela Motif!");

}

}

//product

class JanelaMetal extends Janela

{

public void desenhar() {

System.out.println("Eu sou uma janela Metal!");

}

}

Page 8: Abstract

//Client

public class Cliente {

public static void main(String[] args)

{

AbstractFactory factory = obterFactory(1);

Botao botao = factory.criarBotao();

botao.desenhar();

Janela janela = factory.criarJanela();

janela.desenhar();

}

public static AbstractFactory obterFactory(int tipo)

{

if(tipo == 1 ) {

return new MotifFactory();

} else {

return new MetalFactory();

}

}

}

Page 9: Abstract

EXEMPLOS:

Page 10: Abstract

EXEMPLOS:

Page 11: Abstract

Quando Usar ?

• O sistema deve ser independente de como seus

produtos são criados, compostos e representados;

• O sistema deve ser configurado com uma ou com

múltiplas famílias de produtos;

• Uma família de objetos de produtos relacionados é

projetada para ser usada de forma conjunta e você deva

garantir esta restrição

• Você quer prover uma biblioteca de classes de produtos

e quer revelar apenas suas interfaces e não suas

implementações

Page 12: Abstract

Quando Usar ?

• Deseja-se criar instâncias de um conjunto de classes

relacionadas, sem que se saiba qual classe factory

concreta deve ser instanciada;

• – Na falta de uma classe abstrata, o cliente deve manter

um critério de seleção para selecionar qual das

interfaces disponíveis deve ser usada, em tempo de

execução;

• – Ajuda a evitar duplicação de interfaces para criação

das instâncias, eliminado a necessidade da classe

cliente ter que conhecer diversas interfaces para as diversas classes concretas.

Page 13: Abstract

Vantagens:

• AbstractFactory delega a criação de

objetos-produto a suas subclasses

ConcreteFactory;

• Normalmente uma única instância da

classe ConcreteFactory é criada. Para

criar objetos-produto diferentes, os

clientes devem usar uma fábrica concreta

diferente.

• Facilita a permuta de famílias de produtos

• Promove consistência entre produtos

Page 14: Abstract

Desvantagens:

• Isola classes concretas

• Dificulta o suporte a novos tipos de

produtos

Page 15: Abstract

}