Abstract Factory

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Question book.svg
Esta página ou secção não cita nenhuma fonte ou referência, o que compromete sua credibilidade (desde janeiro de 2014).
Por favor, melhore este artigo providenciando fontes fiáveis e independentes, inserindo-as no corpo do texto por meio de notas de rodapé. Encontre fontes: Googlenotícias, livros, acadêmicoYahoo!Bing. Veja como referenciar e citar as fontes.

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

Utilização[editar | editar código-fonte]

O padrão Abstract Factory pode ser utilizado na implementação de um toolkit que disponibilize controles que funcionem 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 por meio de 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 por meio de uma classe concreta. O aplicativo, ou "cliente", interage com o toolkit por meio das classes abstratas sem ter conhecimento da implementação das classes concretas.

Um exemplo bem simplista seria um projeto com interface para Mobile e para Desktop, uma boa opção para reaproveitar os mesmos controles de interface seria criar pacotes com classes abstratas e os pacotes com as classes concretas implementando apenas as diferenças. Esse padrão também se aplica na padronização de ambientes, por exemplo, tamanhos de botões, fontes, cores de fundo, largura de bordas. Com isso e havendo uma política que exija que os desenvolvedores usem essas classes em vez das nativas da linguagem, ajudará a padronizar a aparência e comportamento das aplicações.

Exemplo[editar | editar código-fonte]

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 por meio 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).

Estrutura[editar | editar código-fonte]

Exemplo de Diagrama em UML para o Padrão Abstract Factory.

Código em Java[editar | editar código-fonte]

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.

Código em VB.NET[editar | editar código-fonte]

Public MustInherit Class WidgetFactory
 
    Shared Function obterFactory() As WidgetFactory
        If Configuracao.obterInterfaceGraficaAtual() Is Configuracao.MotifWidget Then
            Return New MotifWidgetFactory()
        Else
            Return New QtWidgetFactory()
        End If
    End Function
 
    Public MustOverride Function criarBotao() As Botao
 
End Class
 
Public Class MotifWidgetFactory
    Inherits WidgetFactory
 
    Public Overrides Function criarBotao() As Botao
        Return New BotaoMotif
 
    End Function
End Class
 
Public Class QtWidgetFactory
    Inherits WidgetFactory
 
    Public Overrides Function criarBotao() As Botao
        Return New BotaoQt
    End Function
 
End Class
 
Public MustInherit Class Botao
 
    Public MustOverride Sub desenhar()
 
End Class
 
Public Class BotaoMotif
    Inherits Botao
 
    Public Overrides Sub desenhar()
        Console.Out.WriteLine("Eu sou um botão Motif.")
    End Sub
End Class
 
Public Class BotaoQt
    Inherits Botao
 
    Public Overrides Sub desenhar()
        Console.Out.WriteLine("Eu sou um botão Qt.")
    End Sub
End Class
 
Public Class Client
    Public Shared Sub main()
 
        Dim factory As WidgetFactory = WidgetFactory.obterFactory
 
        Dim botao As Botao = factory.criarBotao
 
        botao.desenhar()
 
    End Sub
End Class

Padrões relacionados[editar | editar código-fonte]

Bibliografia[editar | editar código-fonte]