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

From Wiki**3

(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 fabricas (factories) individuais correspondentes a um contexto comum.
+
{{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|600px]]
+
[[Image:abstract-factory-dpcd.png|700px]]
  
==Exemplo==
+
==Exemplo em Java==
  
Ambiente de jogo, jogador, obstaculo.
+
Ambiente de jogo, jogador, obstáculo.
  
=== Interfaces e implementações dos vários intervenientes no ambiente de jogo ===
+
=== 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 EspíritoMaligno implements Obstáculo {
+
   class EspíritoMaligno implements Obstáculo {
     public void acção() { System.out.println("espírito maligno"); }
+
     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>
  
=== Interface e implementações das várias fábricas abstractas ===
+
=== 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 EspíritoMaligno(); }
+
     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 King-fu enfrenta espírito maligno
+
       ambiente2.joga();  // Mestre de Kung-fu enfrenta espírito maligno
 
    
 
    
 
     }
 
     }
 
   }
 
   }
 
+
</source>
[[category:PO 2005/2006]]
+
[[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
   
    }
  }