(→Intervenientes no ambiente de jogo) |
|||
(14 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | O padrão "abstract factory" fornece uma forma de encapsular um conjunto de | + | {{NAVPO}} |
+ | {{TOCright}} | ||
+ | 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 5: | 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== | + | ==Exemplo em Java== |
− | Ambiente de jogo, jogador, | + | 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(); } | interface Obstáculo { void acção(); } | ||
Line 19: | Line 24: | ||
} | } | ||
− | class | + | class EspíritoMaligno implements Obstáculo { |
− | public void acção() { System.out.println(" | + | public void acção() { System.out.println("espírito maligno"); } |
} | } | ||
+ | </source> | ||
+ | <source lang="java"> | ||
interface Jogador { void interageCom(Obstáculo ob); } | interface Jogador { void interageCom(Obstáculo ob); } | ||
Line 38: | Line 45: | ||
} | } | ||
} | } | ||
+ | </source> | ||
− | === | + | === Fábricas abstractas === |
− | // Interface | + | Interface e implementações das várias fábricas abstractas. |
+ | <source lang="java"> | ||
+ | // Interface (fábrica abstracta) | ||
interface FábricaDeJogos { | interface FábricaDeJogos { | ||
Line 47: | Line 57: | ||
Obstáculo fazObstáculo(); | Obstáculo fazObstáculo(); | ||
} | } | ||
+ | </source> | ||
+ | <source lang="java"> | ||
// Fábricas concretas | // Fábricas concretas | ||
Line 57: | Line 69: | ||
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 | + | public Obstáculo fazObstáculo() { return new EspíritoMaligno(); } |
} | } | ||
+ | </source> | ||
=== Ambiente de Jogo === | === Ambiente de Jogo === | ||
− | + | <source lang="java"> | |
class AmbienteDeJogo { | class AmbienteDeJogo { | ||
Line 79: | Line 92: | ||
} | } | ||
+ | </source> | ||
=== Aplicação de Teste === | === Aplicação de Teste === | ||
− | + | <source lang="java"> | |
public class AbstractFactoryPattern { | public class AbstractFactoryPattern { | ||
Line 96: | Line 110: | ||
// Testes | // Testes | ||
ambiente1.joga(); // A Kitty encontrou um puzzle divertido! | ambiente1.joga(); // A Kitty encontrou um puzzle divertido! | ||
− | ambiente2.joga(); // Mestre de | + | ambiente2.joga(); // Mestre de Kung-fu enfrenta espírito maligno |
} | } | ||
} | } | ||
− | + | </source> | |
− | [[category:PO | + | [[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
}
}