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

From Wiki**3

Root (talk | contribs)
Root (talk | contribs)
 
(2 intermediate revisions by the same user not shown)
Line 17: Line 17:
Interfaces e implementações dos vários intervenientes no ambiente de jogo.
Interfaces e implementações dos vários intervenientes no ambiente de jogo.


<java5>
<source lang="java">
   interface Obstáculo { void acção(); }
   interface Obstáculo { void acção(); }


Line 27: Line 27:
     public void acção() { System.out.println("espí­rito maligno"); }
     public void acção() { System.out.println("espí­rito maligno"); }
   }
   }
</java5>
</source>


<java5>
<source lang="java">
   interface Jogador { void interageCom(Obstáculo ob); }
   interface Jogador { void interageCom(Obstáculo ob); }


Line 45: Line 45:
     }
     }
   }
   }
</java5>
</source>


=== Fábricas abstractas ===
=== Fábricas abstractas ===


Interface e implementações das várias fábricas abstractas.
Interface e implementações das várias fábricas abstractas.
<java5>
<source lang="java">
   // Interface (fábrica abstracta)
   // Interface (fábrica abstracta)
    
    
Line 57: Line 57:
     Obstáculo fazObstáculo();
     Obstáculo fazObstáculo();
   }
   }
</java5>
</source>


<java5>
<source lang="java">
   // Fábricas concretas
   // Fábricas concretas
    
    
Line 71: Line 71:
     public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
     public Obstáculo fazObstáculo() { return new EspíritoMaligno(); }
   }
   }
</java5>
</source>


=== Ambiente de Jogo ===
=== Ambiente de Jogo ===
Line 95: Line 95:


=== Aplicação de Teste ===
=== Aplicação de Teste ===
<java5>
<source lang="java">
   public class AbstractFactoryPattern  {
   public class AbstractFactoryPattern  {
    
    
Line 114: Line 114:
     }
     }
   }
   }
</java5>
</source>
[[category:Ensino]]
[[category:Ensino]]
[[category:PO]]
[[category:PO]]
[[category:PO Exemplos]]
[[category:PO Exemplos]]

Latest revision as of 16: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:

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
   
    }
  }