● É um dos padrões criacionais citados no GoF (Gang of Four).
● Permite produzir famílias de objetos relacionados sem especificar suas classes concretas, através de uma única interface. ● O padrão Abstract Factory é composto por dois componentes principais:
○ Fábricas abstratas: definem uma interface para criar objetos de uma
família específica. ○ Fábricas concretas: implementam a interface da fábrica abstrata e criam objetos concretos da família de objetos. ● Para usar o padrão Abstract Factory, você deve primeiro criar uma fábrica abstrata para cada família de objetos que você deseja criar. A fábrica abstrata deve definir uma interface para criar todos os objetos da família. ● Em seguida, você deve criar fábricas concretas para cada fábrica abstrata. As fábricas concretas devem implementar a interface da fábrica abstrata e criar objetos concretos da família de objetos. ● Para criar um objeto de uma família de objetos, você deve primeiro obter uma referência a uma fábrica concreta. Em seguida, você pode chamar os métodos da fábrica concreta para criar os objetos que você deseja. ● O problema que este padrão tenta resolver é da instanciação na existência de uma família de produtos. O exemplo mais conhecido é o seguinte: você tem elementos visuais (produtos), como Window, ScrollBar, Menu e etc. Esses elementos visuais têm diferentes implementações para cada família de implementação gráfica, como o Microsoft Windows, o MAC, e X do Linux. ● Objetivo / intençã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. Também é conhecido como Kit; ● Motivação: O objetivo em empregar o padrão é isolar a criação de objetos de seu uso e criar famílias de objetos relacionados sem ter que depender de suas classes concretas. Isto permite novos tipos derivados de ser introduzidas sem qualquer alteração ao código que usa a classe base; ● Aplicabilidade: Cenários onde uma família de produtos ou classes precisa ser instanciado, sem dependência de suas classes concretas, como no exemplo do livro, onde você tem elementos visuais (produtos), como Window, ScrollBar, Menu e etc. Esses elementos visuais têm diferentes implementações para cada família de implementação gráfica, como o Microsoft Windows, o MAC, e X do Linux; ● Benefícios: ○ Independência da implementação: o padrão Abstract Factory permite que seu código seja independente da implementação específica das classes de objetos que ele usa. Isso pode facilitar a manutenção e a atualização do código. ○ Flexibilidade: o padrão Abstract Factory permite que você crie famílias de objetos de forma flexível. Você pode adicionar ou remover classes de objetos da família sem ter que alterar o código do cliente. ○ Reuso: o padrão Abstract Factory pode ajudar a promover o reuso de código. Você pode criar fábricas abstratas para famílias de objetos comuns e reutilizar essas fábricas em diferentes projetos. ○ Troca de famílias de produtos com facilidade: A classe de uma fábrica concreta aparece apenas uma vez em um aplicativo, ou seja, onde ela é instanciada. Isso facilita a alteração da fábrica concreta usada por um aplicativo. Ele pode usar várias configurações de produto simplesmente alterando a fábrica concreta. Como uma fábrica abstrata cria uma família completa de produtos, toda a família de produtos muda de uma vez. ○ Promoção da consistência entre os produtos: Quando os objetos de produto em uma família são projetados para funcionar em conjunto, é importante que um aplicativo use objetos de apenas uma família por vez. AbstractFactory torna isso fácil de implementar. ● Desvantagens: ○ Complexidade: o padrão Abstract Factory pode adicionar complexidade ao seu código. Você precisa criar fábricas abstratas e fábricas concretas, além de manter as interfaces e implementações dessas classes. ○ Dependência de fábricas: seu código fica dependente das fábricas concretas. Isso pode limitar a flexibilidade do seu código, pois você pode não ser capaz de usar fábricas diferentes sem alterar o código do cliente. ○ Dificuldade de teste: pode ser difícil testar o código que usa o padrão Abstract Factory. Você precisa testar cada fábrica concreta, além do código do cliente. ○ Difícil suportar novos tipos de produtos: Estender fábricas abstratas para produzir novos tipos de produtos não é fácil. Isso porque a interface AbstractFactory fixa o conjunto de produtos que podem ser criados. O suporte a novos tipos de produtos requer a extensão da interface de fábrica, o que envolve alterar a classe AbstractFactory e todas as suas subclasses. Quando usar ● Quando o sistema deve ser independente em termos de como seus objetos são criados, compostos e representados. ● Quando uma família de objetos relacionados precisa ser usada em conjunto. ● Quando você deseja fornecer uma biblioteca de objetos que não mostra implementações, mas apenas expõe interfaces. ● Quando o sistema precisa ser configurado com uma das várias famílias de objetos.