O padrão "abstract factory" fornece uma forma de encapsular um conjunto de fábricas (factories) individuais correspondentes a um contexto comum.
O padrão abstract factory tem a seguinte estrutura de classes:
Ambiente de jogo, jogador, obstáculo.
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>
Interface e implementações das várias fábricas abstractas.
// Interface (fábrica abstracta)
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(); }
}
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>
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 Kung-fu enfrenta espírito maligno } }
</java5>