Difference between revisions of "Abstract Factory Pattern (padrão de desenho)"

From Wiki**3

Line 1: Line 1:
Material correspondente à aula 27.
 
 
 
O padrão "abstract factory" fornece uma forma de encapsular um conjunto de fabricas (factories) individuais correspondentes a um contexto comum.
 
O padrão "abstract factory" fornece uma forma de encapsular um conjunto de fabricas (factories) individuais correspondentes a um contexto comum.
  
Line 12: Line 10:
  
 
Ambiente de jogo, jogador, obstaculo.
 
Ambiente de jogo, jogador, obstaculo.
 +
 +
=== Interfaces e implementações dos vários intervenientes no ambiente de jogo ===
 +
 +
  interface Obstáculo { void acção(); }
 +
 +
  class Puzzle implements Obstáculo {
 +
    public void acção() { System.out.println("um puzzle divertido!"); }
 +
  }
 +
 +
  class EspíritoMaligno implements Obstáculo {
 +
    public void acção() { System.out.println("espírito maligno"); }
 +
  }
 +
 +
  interface Jogador { void interageCom(Obstáculo ob); }
 +
 +
  class Kitty implements Jogador {
 +
    public void interageCom(Obstáculo o) {
 +
      System.out.print("A Kitty encontrou ");
 +
      o.acção();
 +
    }
 +
  }
 +
 +
  class MestreKungFu implements Jogador {
 +
    public void interageCom(Obstáculo o) {
 +
      System.out.print("Mestre de Kung-fu luta contra ");
 +
      o.acção();
 +
    }
 +
  }
 +
 +
=== Interface e implementações das várias fábricas abstractas ===
 +
 +
  // Interface
 +
 
 +
  interface FábricaDeJogos {
 +
    Jogador  fazJogador();
 +
    Obstáculo fazObstáculo();
 +
  }
 +
 +
  // Fábricas concretas
 +
 
 +
  class PuzzlesKitties implements FábricaDeJogos {
 +
    public Jogador  fazJogador()  { return new Kitty();  }
 +
    public Obstáculo fazObstáculo() { return new Puzzle(); }
 +
  }
 +
 
 +
  class DesmembraMata implements FábricaDeJogos {
 +
    public Jogador  fazJogador()  { return new MestreKungFu();    }
 +
    public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
 +
  }
 +
 +
=== Ambiente de Jogo ===
 +
 +
  class AmbienteDeJogo {
 +
 
 +
    private FábricaDeJogos _fa;
 +
    private Jogador _jo;
 +
    private Obstáculo _ob;
 +
 +
    public AmbienteDoJogo(FábricaDeJogos fábrica) {
 +
      _fa = fábrica;
 +
      _jo = fábrica.fazJogador();
 +
      _ob = fábrica.fazObstáculo();
 +
    }
 +
 
 +
    public void joga() {
 +
      _jo.interageCom(_ob);
 +
    }
 +
 
 +
  }
 +
 +
=== Aplicação de Teste ===
 +
 +
  public class AbstractFactoryPattern  {
 +
 
 +
    public static void main(String args[]) {
 +
 
 +
      // Fábricas dos elementos
 +
      FábricaDeJogos fkp = new PuzzlesKitties();
 +
      FábricaDeJogos fdm = new DesmembraMata();
 +
 
 +
      // Ambientes de jogo
 +
      AmbienteDeJogo ambiente1 = new AmbienteDeJogo(fkp);
 +
      AmbienteDeJogo ambiente2 = new AmbienteDeJogo(fdm);
 +
 
 +
      // Testes
 +
      ambiente1.joga();  // A Kitty encontrou um puzzle divertido!
 +
      ambiente2.joga();  // Mestre de King-fu enfrenta espírito maligno
 +
 
 +
    }
 +
  }
  
 
[[category:PO 2005/2006]]
 
[[category:PO 2005/2006]]

Revision as of 21:31, 21 November 2006

O padrão "abstract factory" fornece uma forma de encapsular um conjunto de fabricas (factories) individuais correspondentes a um contexto comum.

Estrutura

O padrão abstract factory tem a seguinte estrutura de classes:

Abstract-factory-dpcd.png

Exemplo

Ambiente de jogo, jogador, obstaculo.

Interfaces e implementações dos vários intervenientes no ambiente de jogo

 interface Obstáculo { void acção(); }
 class Puzzle implements Obstáculo {
   public void acção() { System.out.println("um puzzle divertido!"); }
 }
 class EspíritoMaligno implements Obstáculo {
   public void acção() { System.out.println("espírito maligno"); }
 }
 interface Jogador { void interageCom(Obstáculo ob); }
 class Kitty implements Jogador {
   public void interageCom(Obstáculo o) {
     System.out.print("A Kitty encontrou ");
     o.acção();
   }
 }
 class MestreKungFu implements Jogador {
   public void interageCom(Obstáculo o) {
     System.out.print("Mestre de Kung-fu luta contra ");
     o.acção();
   }
 }

Interface e implementações das várias fábricas abstractas

 // Interface
 
 interface FábricaDeJogos {
   Jogador   fazJogador();
   Obstáculo fazObstáculo();
 }
 // Fábricas concretas
 
 class PuzzlesKitties implements FábricaDeJogos {
   public Jogador   fazJogador()   { return new Kitty();  }
   public Obstáculo fazObstáculo() { return new Puzzle(); }
 }
 
 class DesmembraMata implements FábricaDeJogos {
   public Jogador   fazJogador()   { return new MestreKungFu();    }
   public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
 }

Ambiente de Jogo

 class AmbienteDeJogo {
 
   private FábricaDeJogos _fa;
   private Jogador _jo;
   private Obstáculo _ob;

   public AmbienteDoJogo(FábricaDeJogos fábrica) {
     _fa = fábrica;
     _jo = fábrica.fazJogador(); 
     _ob = fábrica.fazObstáculo();
   }
 
   public void joga() {
     _jo.interageCom(_ob);
   }
 
 }

Aplicação de Teste

 public class AbstractFactoryPattern  {
 
   public static void main(String args[]) {
 
     // Fábricas dos elementos
     FábricaDeJogos fkp = new PuzzlesKitties();
     FábricaDeJogos fdm = new DesmembraMata();
 
     // Ambientes de jogo 
     AmbienteDeJogo ambiente1 = new AmbienteDeJogo(fkp);
     AmbienteDeJogo ambiente2 = new AmbienteDeJogo(fdm);
 
     // Testes 
     ambiente1.joga();   // A Kitty encontrou um puzzle divertido!
     ambiente2.joga();   // Mestre de King-fu enfrenta espírito maligno
  
   }
 }