Singleton Design Pattern

Uma classe com uma única instância e fornece um ponto de acesso global a ela.

O Singleton Pattern é um dos Design Patterns catalogados pelo GoF (Gang of Four) e pertence a categoria dos “Creational Patterns”, é um pattern que limita o número de instâncias de um objeto específico a apenas um.

Uma única instância de um objeto sendo utilizada na sua aplicação é chamada de Singleton.

Em que cenários isto seria útil?

Singletons são úteis em situações em que as ações do sistema devem ser coordenadas à partir de um local central, um bom exemplo é o pool de conexões do banco de dados. O pool gerencia a criação, a distribuição e o tempo de vida de todas as conexões de banco de dados para todo o aplicativo, garantindo que nenhuma conexão esteja perdida.

Vamos a outro exemplo: Logs

Quem aqui nunca precisou utilizar logs na aplicação?

Cenário:

Vamos imaginar um e-commerce, que tem a necessidade de cadastrar produtos, utiliza um software de terceiro para efetuar os pagamentos com cartões e gerar boletos, fazer login também é um requisito da nossa aplicação.

Onde os logs entram? Em todas as transações que o cliente fizer, seja cadastrando um produto, fazendo login no sistema ou fazendo um pagamento, etc.

Possível solução:

Para isso iremos criar uma classe Logger, que terá a responsabilidade de escrever os logs da forma que ela quiser, e em todas as classes que gerenciam uma ou mais trasações eu precisarei criar uma instância da nossa classe de log.

Agora lhe pergunto:

Visto que temos que logar todas as transações do cliente, todas as classes da nossa aplicação que gerenciam uma ou mais transações precisam de uma instância da nossa classe Logger?

Quantas instâncias desta classe estarão na memória fazendo a mesma coisa?

Ai que entra a resposta default daquele desenvolvedor bão, ele diz assim — Depende! rsrsrs

Então qual seria a solução mais adequada a este problema? Singletons.

Diagrama Singleton

Participantes

  • Define um método getInstance() que retorna uma única instância.
  • É responsável por criar e gerenciar a instância do objeto.

Exemplo em Javascript ES2015:

Exemplo em Java:

Exemplo em C#:

Desta forma você terá sempre uma única instância rodando na sua aplicação.

Perceba que é possível implementar o conceito em diversas linguagens, isso porque conceito é mais do que ferramenta, do que frameworks, do que linguagns, como citado no primeiro artigo sobre Design Patterns:

Design patterns não são somente aplicados a desenvolvimento de software, eles podem ser encontrados em diversas áreas da nossa vida.

Diversos outros patterns, tais como, Factory, Prototype e Façade são freqüentemente implementados como Singletons, quando apenas uma instância é necessária.

Por enquanto é isso, espero que vocês tenham gostado, nos vemos no próximo Design Pattern, por favor deixem sugestões, duvidas, críticas, assim podemos aprender cada vez mais.

Referências