Quando Utilizar AbstractFactory

Dai galera,

 Alguem pode citar algum exemplo de como  eu posso utilizar o pattern AbstractFactory ?

valeu

O padrão AbstractFactory é muito usando quando você tem um conjunto de classes, normalmente relacionadas. Por exemplo, no Java, o AbstractFactory é usado para o LookAndFeel.

Vamos supor que você vá fazer um jogo, e quer deixar a parte de inteligência artificial configurável. Você poderia criar uma Abstract Factory assim:

public interface AIFactory { PathFinder createPathFinder(); BossAI createBossAI(int dificultyLevel); WarriorAI createWarriorAI(int level, Weapon weapon); CollisionDetector createCollisionDetector(); }

Dessa forma, você poderia variar as classes de AI em diferentes implementações. Normalmente, as classes num abstract factory trabalham em “harmonia”. Por exemplo, o Look And Feel de um botão corresponde ao Look and Feel de um ComboBox, ListBox, etc. Então, uma fábrica abstrata ajuda a ao desenvolvedor entender que existe esse tipo de relacionamento entre as classes.

Pelo q entendi segundo ViniGodoy, é q o AbstractFactory é responsavel por criar os objetos que tem uma “relacao” entre si. Sendo diferente de factory por que chama o metodo q precisar, nao passando parametro para dizer qual objeto quer criar ???.

Putz, to na empresa nao consigo acessar outros sites.

valeu

Vo quebrar teu galho:
Fonte: Wikipedia

Abstract Factory é um padrão de projeto de software (design pattern em inglês). Este padrão permite a criação de famílias de objetos relacionados ou dependentes, através de uma única interface e sem que a classe concreta seja especificada.

Utilização

O padrão Abstract Factory pode ser utilizado na implementação de um toolkit que disponibilize controles que funcionam em diferentes interfaces gráficas, tal como Motif, GTK+ (GNOME) ou Qt (KDE). Estas GUIs possuem diferentes padrões de controles visuais e, para facilitar a construção de aplicativos que interajam facilmente com diferentes interfaces gráficas, é interessante que se defina interfaces comuns para acesso aos controles, independentemente da GUI utilizada. Este problema pode ser resolvido através uma classe abstrata que declara uma interface genérica para criação dos controles visuais e de uma classe abstrata para criação de cada tipo de controle. O comportamento específico, de cada um dos padrões tecnológicos contemplados, é implementado através de uma classe concreta. O aplicativo, ou “cliente”, interage com o toolkit através das classes abstratas sem ter conhecimento da implementação das classes concretas.

Exemplo

Neste exemplo, a classe abstrata WidgetFactory possui duas especializações: MotifWidgetFactory para widgets Motif e QtWidgetFactory para widgets Qt. Essas especializações são classes concretas capazes de “produzir” os elementos da interface gráfica. O cliente do toolkit obtém os elementos gráficos de que necessita através da classe (interface) WidgetFactory sem ter conhecimento das classes concretas. Da mesma maneira, o cliente somente interage com as interfaces que representam os elementos produzidos pela Abstract Factory (no exemplo, a classe Janela e a classe Botao).

Código

Este código, escrito na linguagem Java, mostra a implementação do diagrama mostrado acima. Por uma questão de simplicidade, o código relacionado às janelas é omitido.

abstract class WidgetFactory
 {
     public static WidgetFactory obterFactory()
     {
 
         if( Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget )
         {
             return new MotifWidgetFactory();
         }
         else
         {
             return new QtWidgetFactory();
         }
    }
 
    public abstract Botao criarBotao();
 }
 
 class MotifWidgetFactory extends WidgetFactory
 {
     public Botao criarBotao()  {
         return new BotaoMotif();
     }
 }
 
 class QtWidgetFactory extends WidgetFactory
 {
     public Botao criarBotao()  {
         return new BotaoQt();
     }
  }
 
 abstract class Botao
 {
     public abstract void desenhar();
 }
 
 class BotaoMotif extends Botao
 {
     public void desenhar()  {
        System.out.println("Eu sou um botao Motif!");
     }
 }
 
 class BotaoQt extends Botao
 {
     public void desenhar()  {
        System.out.println("Eu sou um botao Qt!");
     }
 }
 
 public class Cliente
 {
     public static void main(String[] args)
     {
         WidgetFactory factory = WidgetFactory.obterFactory();
 
         Botao botao = factory.criarBotao();
         botao.desenhar();
     }
 }

Este exemplo imprimiria na tela o texto “Eu sou um botao Motif!” ou “Eu sou um botao Qt!” dependendo do valor retornado pelo método Configuracao.obterInterfaceGraficaAtual(), que descobre a interface gráfica, Motif ou Qt, utilizada pelo sistema.

[]´s

Po valeu em cara…