A Fábrica de Arquitetos IX – Abstract Factory Pattern



...

Fala desenvolvedor, tudo bem? Hoje estou aqui com o nono artigo da série “A Fábrica de Arquitetos” e dessa vez estou trazendo um padrão que herda do artigo anterior, estamos falando do Abstract Factory Pattern!

Um padrão que pode resolver e evitar um acoplamento desnecessário quando precisamos criar fábricas mais complexas.

 

 

O que é

 

Frequência de uso: 5/5 - Alto

Antes de sairmos escrevendo código precisamos entender o que faz esse padrão, porém creio que fica muito mais fácil de entender lendo o artigo anterior sobre Factory Pattern.

O padrão Abstract Factory ou Fábrica Abstrata é um padrão da categoria dos Criacionais no qual seu objetivo é a criação de famílias de objetos.

Ok Lucas, mas quando eu vou precisar criar uma família de objetos ou ter uma fábrica para essa finalidade?

Eu te explico jovem desenvolvedor, imagine o seguinte cenário: Você está desenvolvendo uma aplicação para empresa de resgates, onde seu usuário pode solicitar um pedido de socorro.

Essa aplicação deve dividir os tipos de solicitação resgates por tamanho (pequeno, médio, grande) e ambiente (terrestre, marinho, aéreo) para então mandar o veículo e a equipe correta.

Pare um segundo e imagine de forma simples como você lidaria com esse problema! Imaginou? Agora com sua solução pense, e se você precisasse adicionar outros tipos de ambientes e tamanhos para o resgate, será que conseguiria implementar sem acoplamento e gerar um código “macarrônico”?

Bom existem algumas soluções para esse problema, e cenários como este são bem comuns, porém o Abstract Factory consegue auxiliar a criar nossas famílias de objetos para a geração de pedidos de socorro!

Logo abaixo vou deixar o UML do padrão.

 

 

Show me the code!
 

Diferente dos artigos anteriores não vou dividir entre entendimento completo do padrão e depois o código, vou apresentar seu entendimento e código ao mesmo tempo.

Então vamos lá, usando o mesmo exemplo anterior dos resgates, primeiro precisamos da nossa entidade principal do sistema que será Acidente.

 

Acidente.cs

 

TipoAcidente.cs

 

LocalAcidente.cs

 

Agora precisamos criar a nossa entidade de pedido de socorro.

 

Socorro.cs

 

Nessa entidade vale ressaltar alguns pontos interessantes, perceba que ela tem um método virtual GerarSolicitacaoDeSocorro, que recebe como parâmetro um acidente, esse método será sobrescrito por suas fábricas especializadas, que são elas:

 

SocorroGrandeFactory.cs

 

SocorroMedioFactory.cs

 

SocorroPequenoFactory.cs

 

Bom, você consegue perceber que essas factories especializadas herdam de Socorro e implementam o método GerarSolicitacaoDeSocorro que de acordo com o local do acidente monta o pedido de socorro.

Nesse momento você deve estar se perguntando, quem vai gerar o objeto dessas factories para nós? Eu te respondo, é aí que entra o objeto final da nossa fábrica abstrata, o SocorroFactory.

 

SocorroFactory.cs

 

Agora sim nossa fábrica abstrata está pronta! Note que a SocorroFactory irá fazer a divisão pelo ponto principal que é o tamanho do nosso acidente e então irá nos devolver uma factory especializada que irá gerar o pedido de socorro de acordo com o ambiente do acidente!

Com isso concluímos que temos uma Fábrica Abstrata que dado uma condição irá nos devolver uma fábrica especializada que aí sim irá nos retornar um objeto.

Então se tiver outros N tipos de acidente podemos utilizar nossa fábrica abstrata para poder nos retornar uma fábrica especializada para gerar um objeto completo.

Dessa forma tiramos totalmente o acoplamento e evitamos encher nosso código de If’s, tornando – o reutilizável e testável!

Por fim deixo aqui um exemplo de execução do nosso padrão.

 

Program.cs

 

 

Conclusão

 

No artigo de hoje entendemos e implementamos o padrão Abstract Factory no qual criamos uma fábrica que nos gera uma família de objetos, ou melhor, uma Factory de Factories!

Vimos um cenário dos muitos que podem acabar aparecendo no dia a dia de desenvolvimento.

Um fato engraçado sobre este artigo, é que o código apresentado está em produção em um aplicativo de resgates desde 2016, onde eles têm mais de 20 tipos de pedidos de socorro e funciona muito bem!!

Espero que tenha ficado claro e simples sua importância e utilização!

Agradeço a atenção e bons estudos!!!!!

Caso precise entrar em contato, me mande uma mensagem aqui.

Baixe o projeto clicando aqui.