Fala devs, beleza? Eu estou bem, aproveitando o tempinho que tive agora no fim do ano para escrever mais um artigo para vocês!
Dessa vez trago mais um artigo da série “A Fábrica de Arquitetos” e estou trazendo um padrão que é consideravelmente desconhecido porém em determinados cenários é muito útil, o padrão Flyweight!
…
O que é?
Frequência de uso: 1/5 – Muito Baixo
O Flyweight Pattern é um padrão da família dos estruturais no qual o objetivo é evitar o desperdício de memória salvando objetos já criados e retornando – os quando solicitado.
Imagine o seguinte cenário, você tem alguns objetos que te retornam à descrição de empresas de uma determinada categoria, a instância desse objeto é consideravelmente custosa para o servidor e você precisa instanciar – los algumas vezes durante a execução do código.
Nesse caso você pode pensar “Ah, mas é só usar o Singleton! Assim o objeto fica em memória na primeira vez que eu instanciar.”
Pode até fazer sentido, mas imagine que ao invés de 1, você tenha 5, 10 tipos de objetos que necessitam de instância e essa instância é dada seguindo uma condição.
Por fim seu pensamento deve ser, “Ah é só juntar o padrão Singleton com o padrão Factory, assim consigo ter os objetos em memória”, se foi isso que você pensou parabéns! Basicamente o padrão Flyweight é uma junção desses padrões!
Logo abaixo vou deixar o diagrama do padrão:
…
Show me the code!
Bom não existe jeito melhor de aprender do que fazer, vamos então implementar o exemplo anterior, uma lista de empresas no qual contem sua descrição e alguns dados adicionais.
Primeiramente vamos precisar de uma entidade base.
Company.cs
Com nossa entidade base criada, podemos criar as entidades especializadas que vão representar as empresas.
FoodCompany.cs
SoftwareCompany.cs
Perceba que ambos os objetos têm valores setados em sua instância, dependendo do servidor/hardware no qual você esteja executando e quantas vezes você precise instanciar pode se tornar algo não performático.
Agora vamos criar a Factory que irá implementar o padrão Flyweight.
CompanyFactory.cs
Perceba que temos um dicionário estático que contêm um id e um objeto, nesse dicionário iremos salvar os objetos já instanciados.
Note que na factory antes de executarmos a instância verificamos se o objeto já foi instânciado, caso já tenha sido retornamos a mesma instância, senão criamos uma nova e salvamos no dicionário.
Logo, assim que eu instanciar a primeira vez o objeto já ficará em memória, se eu precisar novamente não irei gastar performance instanciando novamente apenas retorno o que já estava em memória de acordo com o ponteiro do dicionário.
Em resumo, o Flyweight é um padrão pouco usado, EU ACREDITO que seja mais viável aplicar ele em cenários de aplicações embarcadas ou com hardware muito escasso, afinal hoje felizmente temos um gerenciamento de memória muito bom por parte do .NET e dos frameworks de alto nível!
Por fim vamos a execução.
Program.cs
Software
Food
…
Conclusão
Hoje vimos um padrão um tanto quanto incomum, porém muito útil para determinados cenários, principalmente quando temos pouco recurso de hardware, um padrão importante para termos na nossa caixinha de ferramentas!
Espero que tenha ficado claro e objetivo quando usar esse padrão ;)
Agradeço a atenção e bons estudos!!!!!
Caso precise entrar em contato, me mande uma mensagem aqui.
Baixe o projeto clicando aqui.
AVISO
Minha nova plataforma já está em construção! irá conter todos os recursos dessa plataforma, cursos pagos e gratuitos, treinamentos, mentorias e muito mais, caso queira ter acesso antecipado (gratuito) e ser um dos primeiros a testar me mande um email em lucas.eschechola@outlook.com, obrigado!