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

From Wiki**3

Root (talk | contribs)
Root (talk | contribs)
No edit summary
Line 1: Line 1:
<!-- {{TOCright}} -->
{{TOCright}}
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 fábricas (''factories'') individuais correspondentes a um contexto comum.


==Estrutura==
==Estrutura==
Line 10: Line 10:
==Exemplo==
==Exemplo==


Ambiente de jogo, jogador, obstaculo.
Ambiente de jogo, jogador, obstáculo.


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


Interfaces e implementações dos vários intervenientes no ambiente de jogo.
<java5>
   interface Obstáculo { void acção(); }
   interface Obstáculo { void acção(); }


Line 20: Line 23:
   }
   }


   class EspíritoMaligno implements Obstáculo {
   class EspíritoMaligno implements Obstáculo {
     public void acção() { System.out.println("espírito maligno"); }
     public void acção() { System.out.println("espí­rito maligno"); }
   }
   }
</java5>


<java5>
   interface Jogador { void interageCom(Obstáculo ob); }
   interface Jogador { void interageCom(Obstáculo ob); }


Line 39: Line 44:
     }
     }
   }
   }
</java5>


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


   // Interface
Interface e implementações das várias fábricas abstractas.
<java5>
   // Interface (fábrica abstracta)
    
    
   interface FábricaDeJogos {
   interface FábricaDeJogos {
Line 48: Line 56:
     Obstáculo fazObstáculo();
     Obstáculo fazObstáculo();
   }
   }
</java5>


<java5>
   // Fábricas concretas
   // Fábricas concretas
    
    
Line 58: Line 68:
   class DesmembraMata implements FábricaDeJogos {
   class DesmembraMata implements FábricaDeJogos {
     public Jogador  fazJogador()  { return new MestreKungFu();    }
     public Jogador  fazJogador()  { return new MestreKungFu();    }
     public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
     public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
   }
   }
</java5>


=== Ambiente de Jogo ===
=== Ambiente de Jogo ===
 
<java5>
   class AmbienteDeJogo {
   class AmbienteDeJogo {
    
    
Line 80: Line 91:
    
    
   }
   }
 
</java5>
=== Aplicação de Teste ===
=== Aplicação de Teste ===
 
<java5>
   public class AbstractFactoryPattern  {
   public class AbstractFactoryPattern  {
    
    
Line 97: Line 108:
       // Testes  
       // Testes  
       ambiente1.joga();  // A Kitty encontrou um puzzle divertido!
       ambiente1.joga();  // A Kitty encontrou um puzzle divertido!
       ambiente2.joga();  // Mestre de King-fu enfrenta espírito maligno
       ambiente2.joga();  // Mestre de King-fu enfrenta espírito maligno
    
    
     }
     }
   }
   }
 
</java5>
[[category:OOP]]
[[category:OOP]]
[[category:Teaching]]
[[category:Teaching]]

Revision as of 11:03, 1 October 2010

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

Estrutura

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

Exemplo

Ambiente de jogo, jogador, obstáculo.

Intervenientes no ambiente de jogo

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

<java5>

 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"); }
 }

</java5>

<java5>

 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();
   }
 }

</java5>

Fábricas abstractas

Interface e implementações das várias fábricas abstractas. <java5>

 // Interface (fábrica abstracta)
 
 interface FábricaDeJogos {
   Jogador   fazJogador();
   Obstáculo fazObstáculo();
 }

</java5>

<java5>

 // 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(); }
 }

</java5>

Ambiente de Jogo

<java5>

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

</java5>

Aplicação de Teste

<java5>

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

</java5>