Abstract
Click here to load reader
-
Upload
alan-oliveira -
Category
Documents
-
view
44 -
download
0
Transcript of Abstract
ABSTRACTFACTORY
Alan O. De Sousa
Rafael B. Cabral
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
Diagrama de Classes
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();
}
}
//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();
}
//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();
}
//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!");
}
}
//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();
}
}
}
EXEMPLOS:
EXEMPLOS:
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
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.
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
Desvantagens:
• Isola classes concretas
• Dificulta o suporte a novos tipos de
produtos
}