(→Intervenientes no ambiente de jogo) |
|||
(15 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | {{NAVPO}} | |
− | + | {{TOCright}} | |
− | O padrão "abstract factory" fornece uma forma de encapsular um conjunto de | + | 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 7: | Line 7: | ||
O padrão ''abstract factory'' tem a seguinte estrutura de classes: | O padrão ''abstract factory'' tem a seguinte estrutura de classes: | ||
− | [[Image:abstract-factory-dpcd.png| | + | [[Image:abstract-factory-dpcd.png|700px]] |
+ | |||
+ | ==Exemplo em Java== | ||
+ | |||
+ | Ambiente de jogo, jogador, obstáculo. | ||
+ | |||
+ | === Intervenientes no ambiente de jogo === | ||
+ | |||
+ | Interfaces e implementações dos vários intervenientes no ambiente de jogo. | ||
+ | |||
+ | <source lang="java"> | ||
+ | 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"); } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <source lang="java"> | ||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === Fábricas abstractas === | ||
+ | |||
+ | Interface e implementações das várias fábricas abstractas. | ||
+ | <source lang="java"> | ||
+ | // Interface (fábrica abstracta) | ||
+ | |||
+ | interface FábricaDeJogos { | ||
+ | Jogador fazJogador(); | ||
+ | Obstáculo fazObstáculo(); | ||
+ | } | ||
+ | </source> | ||
− | = | + | <source lang="java"> |
+ | // 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(); } | ||
+ | } | ||
+ | </source> | ||
− | Ambiente de | + | === Ambiente de Jogo === |
+ | <source lang="java"> | ||
+ | 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); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
− | [[category:PO | + | === Aplicação de Teste === |
+ | <source lang="java"> | ||
+ | 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 | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | [[category:Ensino]] | ||
+ | [[category:PO]] | ||
+ | [[category:PO Exemplos]] |
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.
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 (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);
}
}
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
}
}