Abstract Factory Pattern (padrão de desenho)

From Wiki**3

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