Abstract Factory
Seguindo o tema Design Patterns hoje irei falar sobre o Abstract Factory. O Abstract Factory é um Padrão de Criação que disponibiliza uma interface (Abstract Factory) utilizada para criar famílias de objetos (Products) relacionados ou inter-dependentes entre si, sem a necessidade de especificar suas classes concretas.
Conforme a imagem acima o Abstract Factory é composto pelos seguintes papéis:
- Abstract Factory: é uma interface onde ficam declaradas as operações de criação de abstrações dos produtos (abstract product);
- Concrete Factory: são classes que implementam as operações declaradas na interface (abstract factory), sendo responsáveis pela criação dos objetos (concrete product), representam as famílias de produtos que serão consumidas pelo client;
- Abstract Product: declara uma interface para o objeto (concrete product);
- Concrete Product: implementa a interface do abstract product, representa o objeto (concrete product) que foi criado a partir da concrete factory correspondente;
- Client: é o sistema que utiliza a interface (abstract factory) para ter acesso aos produtos (abstract product);
Pros e contras
O padrão Abstract Factory isola as classes concretas dos produtos. O cliente tem acesso apenas as interfaces abstratas que representam os produtos. Isto se dá por que a Abstract Factory encapsula a responsabilidade e o processo de criação dos objetos delegando esta responsabilidade para as Concrete Factory e retornando para o cliente apenas uma interface do produto. Isso facilita a manutenibilidade do código.
A classe da Concrete Factory aparece no Client apenas quando é instanciada. Isto faz com que seja bastante fácil trocar a familia de produtos que se deseja manipular no Client, para isto basta instanciar uma Concrete Factory diferente.
O Client deverá seguir funcionando normalmente, pois ele interage com a interface do Abstract Product e ao substituir uma Concrete Factory por outra o cliente estará recebendo um Concrete Product diferente mas que respeita a interface Abstract Product.
Por fim, o principal ponto negativo do padrão Abstract Factory e o fato de que caso seja necessário adicionar um novo Product será preciso modificar a interface da Abstract Factory e todas suas sub classes.
Espero que tenham gostado artigo, o próximo Pattern que irei trazer é o Builder. Por último deixo o link do meu repositório do Github onde coloco os códigos que desenvolvi nestes estudos sobre os Patterns. Espero que seja útil.
Até a próxima :)