Abstract Factory Pattern (padrão de desenho)

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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
   
    }
  }