A Fábrica de Arquitetos IV - Singleton Pattern



...

Falaaaaaa desenvolvedor, tudo bem???? Comigo está tudo tranquilo e hoje dando continuidade a série de artigos A Fábrica de Arquitetos vamos falar sobre um dos padrões mais antigos e conhecidos que é o Singleton Pattern.

Há quem diga que esse é um anti-pattern, porém irei mostrar 2 formas de se implementar e alguns cenários no qual NA MINHA VISÃO é um pattern muito bem aplicado.

 

 

O que é?

 

Frequência de uso: 3/5 — Médio Baixo

O padrão Singleton é um dos padrões mais simples, tanto de se entender, quanto de se aplicar, é um padrão que nos disponibiliza apenas uma instância de uma determinada classe durante toda a execução do código.

E onde eu usaria isso? Eu te digo jovem desenvolvedor, imagine que ao instânciar uma classe DataLoader você trouxesse junto uma lista de centenas arquivos que serão utilizados durante a execução do código, agora pense que você precisa da instância dessa classe em diversos pontos distintos, o quão pesado e lento seria se você tivesse que carregar esses mesmos arquivos em todos esses pontos.

E tá ai um ótimo cenário para você aplicar o Singleton Pattern, os arquivos são carregados na primeira vez que a classe é instânciada e em todos os outros pontos nos quais necessitam, utiliza a instância já existente.

E esse é só um dos cenários nos quais o Singleton pode ser aplicado, abaixo segue o UML sobre o pattern.

 

 

Mãos no Código!

 

Para exemplificar vou usar o exemplo acima, porém não vou carregar arquivos de verdade, como é um exemplo, vou carregar um nome fictício de 25 mil arquivos.

Para isso precisamos da nossa classe Singleton:

 

Vamos entender um pouco sobre o que está acontecendo aqui, temos uma classe estática DataLoader e dentro uma propriedade chamada Instance, com o modificador de acesso get, nele verificamos se a instância é ou não nula, se for, gera uma nova senão retorna a existente.

OBS: Quando uma classe é estática ela não necessita de instância e seu estado é o mesmo durante o ciclo da aplicação, por isso ela é “estática”, não muda.

Por fim quando a classe é instânciada ele gera 25 mil cadeias de caracteres simulando o carregamento dos arquivos.

Porém, essa implementação tem um pequeno grande problema, imagine que sua aplicação tem muitos acessos, caso a instância não tenha sido feita a primeira vez e 2 threads fizerem a verificação ao mesmo tempo, o retorno será nulo e logo irá criar 2 instâncias para a mesma instância que deveria ser única.

Podermos resolver esse pequeno problema bloqueando o acesso multithread na nossa própria classe utilizando a palavra-chave lock (Esse recurso é disponível utilizando C#), ela cria um bloqueio no objeto garantindo que só seja desbloqueado por uma thread por vez, assim garantimos que a instância será única.

 

O único defeito de utilizar esse tipo de implementação é que a performance é levemente afetada, afinal uma thread tem que esperar a outra para poder acessar a mesma instância em memória.

Por fim, para podermos utilizar a instância única temos o seguinte código de teste.

 

 

Conclusão

 

Hoje vimos como utilizar o Singleton Pattern e possíveis cenários nos quais ele pode ser aplicado, também vimos como aplicar ele de forma que ele funcione corretamente utilizando linguagem C#, espero que tenha ficado claro sua importância e como utilizar 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.