🖥️
Padrões de Projeto
  • Padrões de Projeto
  • Orientação a Objetos
    • Conceitos básicos de orientação a objetos
      • Objetos e classes
      • Encapsulamento
      • Relacionamentos
      • Herança
      • Realização
      • Polimorfismo
      • Imutabilidade
  • Princípios SOLID
    • Introdução
    • SRP - Princípio de Responsabilidade Única
    • OCP - Princípio de Aberto/Fechado
    • LSP - Princípio de Substituição de Liskov
    • ISP - Princípio de Segregação de Interfaces
    • DIP - Princípio de Inversão de Dependência
  • Padrões de Projetos e catálogos
    • Introdução
  • Padrões Comportamentais
    • Padrão Strategy
    • Padrão State
    • Padrão Observer
    • Padrão Chain of Responsibility
    • Padrão Command
    • Padrão Template Method
    • Padrão Null Object
  • Padrões Criacionais
    • Padrão Singleton
    • Padrão Prototype
    • Padrão Builder
    • Padrões Factory
      • Factory Method
      • Abstract Factory
  • Padrões Estruturais
  • Padrão Adapter
  • Padrão Facade
  • Padrão Decorator
  • Padrão Proxy
  • Padrão Bridge
  • Padrão Composite
Powered by GitBook
On this page

Was this helpful?

  1. Padrões Criacionais
  2. Padrões Factory

Abstract Factory

O Abstract Factory é um padrão de projeto que resolve o problema de criar famílias inteiras de produtos que só funcionam em conjunto, sem que seja necessário especificar suas classes concretas.

O Abstract Factory define uma interface para criar todos os produtos distintos, mas deixa a criação real do produto para classes de fábrica concretas. Cada tipo de fábrica corresponde a uma determinada família de produtos.

Um Abstract Factory na prática é apenas uma extensão do Factory Method, usando de vários métodos em uma classe especializada em construir objetos de uma mesma família.

Vamos usar o mesmo exemplo de antes, expandindo para o conceito de família de objetos.

public abstract class Dialogo {
    public abstract Botao criarBotao();
    public abstract Janela criarJanela();
    public abstract CampoFormulario criarCampoFormulario();
}

Nesse exemplo, cada janela de Dialogo concreta, que estende de Dialogo, deve ter também suas implementações próprias dos componentes que usa, como Botao, Janela e CampoFormulario. Já imaginou uma tela para Linux utilizando botões de Windows e com campos de formulário próprios para o MacOS? Não faz sentido, né?

Pois bem, nesse caso, toda vez que quisermos criar uma janela de Dialogo para um sistema operacional especifico, iremos usar sua própria Abstract Factory, como no exemplo abaixo:

public class DialogoLinux extends Dialogo {
    public Botao criarBotao() {
        return new BotaoLinux(); // BotaoLinux é uma classe especializada de Botao
    }
    public Janela criarJanela() {
        return new JanelaLinux();
    }
    public CampoFormulario criarCampoFormulario() {
        return new CampoFormularioLinux();
    }
}

Dessa maneira, sempr que quiseremos "mudar" a família de objetos, só precisamos usar uma instância da fábrica referente a família desejada (Linux, Mac ou Windows).

Exemplos de Abstract Factory nas APIs nativas do Java

Para citar exemplos de objetos que funcionam apenas com objetos da mesma família, podemos falar dos drivers JDBC para bancos (PostgreSQL, Oracle, etc). A classe Connection funciona como uma fábrica abstrata que cria vários objetos que só funcionam como uma família especifica, relacionada ao banco de dados que se deseja comunicar. Desse modo, quando criamos uma consulta (PreparedStatement) ou executamos a mesma para obter os resultados (ResultSet), estamos usando objetos da mesma família que, de outro modo, não funcionariam em conjunto.

PreviousFactory MethodNextPadrão Adapter

Last updated 4 years ago

Was this helpful?