Line 1: | Line 1: | ||
− | |||
− | |||
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]] |
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 tem a seguinte estrutura de classes:
Ambiente de jogo, jogador, obstaculo.
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 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); } }
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 } }