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.
