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

From Wiki**3

Root (talk | contribs)
No edit summary
Root (talk | contribs)
No edit summary
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 19: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:

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