Abstract Factory Pattern (padrão de desenho)
From Wiki**3
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 } }