Abstract Factory Pattern (padrão de desenho)

From Wiki**3

Revision as of 21:31, 21 November 2006 by Root (talk | contribs)

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