Como Implementar O Padrão de Projeto Abstract Factory em Python

Neste artigo nós vamos ver como utilizar o design pattern Abstract Factory em Python. Este é o primeiro padrão de projeto que veremos nesta série de artigos sobre como utilizar os padrões descritos no livro do Gang of Four.

Série Design Patterns em Python

Antes de mais nada, eu gostaria de deixar aqui o repositório no github que eu criei com os exemplos dessa série. Se acaso você queira conferir, basta acessar o link: https://github.com/ceb10n/design-patterns-with-python

O que é o Padrão Abstract Factory?

O design pattern Abstract Factory é um padrão de projeto especificado no livro Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos, e tem como objetivo isolar a criação de objetos de seu uso.

Antes de continuarmos com a implementação do Abstract Factory em Python, vamos dar uma olhada no seu conceito, para que ele serve, etc.

O padrão Abstract Factory fornece uma interface para a criação de objetos que se relacionam ou de objetos dependentes, porém sem a necessidade de informar a sua implementação concreta.

Elementos Presentes no Abstract Factory

O padrão de projeto Abstract Factory faz uso dos seguintes elementos:

  • AbstractFactory
  • ConcreteFactory
  • AbstractProduct
  • ConcreteProduct
  • Client

Vamos dar uma olhada no conceito do Abstract Factory em Python?

Abstract Factory em Python – Abstract Factory

O AbstractFactory, ou fábrica abstrata é a interface que define as operações que realizarão a criação de produtos abstratos.




Abstract Factory em Python – Concrete Factory

A fábrica concreta é a classe responsável pela criação dos produtos concretos.

Abstract Factory em Python – Abstract Product

O produto abstrato define a interface de um determinado tipo de objeto.

Abstract Factory em Python – Concrete Product

O produto concreto será criado pela fábrica concreta .




Abstract Factory em Python – Client

O cliente é quem efetivamente fará uso tanto da fábrica abstrata, quanto do produto abstrato.

Abstract Factory em Python – Uma Abordagem Mais Real

Agora que já vimos o que é o padrão de projeto Abstract Factory, vamos pensar em algo um pouco mais real.

Vamos imaginar a situação:

Nós temos uma loja especializada de celulares por marca, e uma loja de celulares que vende diversas marcas.

Nós precisamos que os celulares sejam construídos, e também precisamos mostrar a qualidade da foto para um determinado cliente da loja.

Uma Fábrica de Celulares

Neste caso, a nossa Abstract Factory seria a definição de uma fábrica de celulares, certo?

Um Produto de Alta Qualidade

Agora que já temos a nossa fábrica de celulares, nós vamos definir um produto de alta qualidade! Afinal, nós queremos fotos de qualidade, certo?!

Fábricas Reais de Celulares

Agora nós precisamos de nossas fábricas construindo os celulares de alta qualidade, e que tiram fotos!

Na falta de criatividade, vamos de Apple e Samsung mesmo!

Produtos de Alta Qualidade

Agora que já temos as nossas fábricas reais, vamos definir alguns produtos de alta qualidade!

As Nossas Lojas

Agora temos lojas que vendem celulares específicos, e lojas que vendem celulares de todas as marcas.

Passeando Pelas Lojas

Agora que já temos toda a nossa estrutura montada, vamos dar uma olhada em nossas lojas!

Precisa de Tudo Isso?

Nós estamos vendo o padrão de projeto Abstract Factory em Python, certo?!

É sempre legal lembrar que o Python disponibiliza pra gente o duck typing.

Em outras palavras, não precisamos de interfaces (nem existem no Python) ou herança para que tenhamos um comportamento padronizado.

Vamos ver como fica o código utilizando duck typing?

Não Precisamos Mudar Nada

Note que só removemos a estrutura de classes abstratas do código, porém, todo o resto ficou exatamente a mesma coisa:


Legal, você não acha?!

Porém, é importante notar que é sempre importante tomar cuidado.

Em linguagens mais verbosas como o Java ou C#, nós somos meio que obrigados a criar toda uma estrutura que em Python nós não precisamos graças ao duck typing.

Porém, quando nós não somos obrigados a fazer algo, é importante que saibamos exatamente quais são as convenções, padrões, etc., para que não criemos mais problemas do que precisamos.

Uma boa saída neste caso, é documentar bem o seu código.

with great power comes great responsibility

Conclusão

Assim como todos os outros padrões de projetos, é necessário cautela para que não coloquemos mais complexidade do que precisamos em nosso código.

Os padrões de projeto são importantes para trabalhemos de maneira uniforme na resolução de problemas comumente encontrados em nosso dia a dia, porém, nós devemos nos atentar justamente para isso, eles são feitos para resolver problemas, e não criar problemas desnecessários.

Gostou do artigo sobre Abstract Factory em Python? Não deixe de comentar com a sua opinião, sugestão ou crítica!

Um grande abraço e até o próximo artigo 😉




Leave a Reply