Difference between revisions of "Abstract Factory Pattern (padrão de desenho)"

From Wiki**3

 
(Intervenientes no ambiente de jogo)
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
Material correspondente à aula 27.
+
{{NAVPO}}
 
+
{{TOCright}}
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 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>
  
==Exemplo==
+
<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 jogo, jogador, obstaculo.
+
=== 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 2005/2006]]
+
=== 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]]

Latest revision as of 18:49, 14 November 2019

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

O padrão "abstract factory" fornece uma forma de encapsular um conjunto de fábricas (factories) individuais correspondentes a um contexto comum.

Estrutura

O padrão abstract factory tem a seguinte estrutura de classes:

Abstract-factory-dpcd.png

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.

  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();
    }
  }

Fábricas abstractas

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(); }
  }

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 Kung-fu enfrenta espírito maligno
   
    }
  }