Algumas vezes é comum nos depararmos com uma situação onde precisamos garantir que um determinado objeto seja instanciado apenas uma vez durante todo o ciclo de vida de nossa aplicação, como por exemplo, no caso de conexões com o banco de dados. Este é um problema bastante comum e pode se repetir com objetos de configuração e outros objetos comuns no nosso dia a dia. Para resolver este problema existe um padrão de projeto chamado Singleton, que nos fornece uma especificação de como solucionar isto de maneira elegante e orientada a objetos.
Este tema é útil sempre que precisarmos garantir que um determinado objeto seja instanciado apenas uma vez na nossa aplicação como, por exemplo, um objeto que encapsule a aplicação em si, um objeto de configurações ou até mesmo um objeto que gerencia a conexão com o banco de dados. Com a correta implementação do Singleton nós temos a certeza que tais objetos não serão instanciados mais de uma vez, fazendo com que nossa aplicação economize recursos e tenha uma melhor gestão sobre seus objetos.
Design patterns são soluções específicas para determinados problemas que encontramos de forma corriqueira no cotidiano dos projetos de software, sendo que os mesmos podem se dividir em três grupos:
- Criacionais – Os design patterns deste grupo definem estratégias para a criação de nossos objetos, evitando que tenhamos a instanciação de objetos pulverizada por toda aplicação. Como exemplos deste grupo temos os patterns Singleton, Builder, Prototype, Factory e Abstract Factory.
- Estruturais – Os design patterns deste grupo definem estratégias para lidar com problemas de organização e estruturação de nossos objetos. Como exemplos deste grupo temos os patterns Adapter, Composite e Facade.
- Comportamentais - Os design patterns deste grupo definem estratégias para solucionar problemas relativos ao comportamento e a comunicação entre nossos objetos. Como exemplos deste grupo temos os patterns Command, Strategy e Observer.
Neste artigo explicaremos os principais conceitos sobre o design pattern criacional Singleton, assim como a maneira correta de implementação deste.
Simulando o problema
Em alguns momentos no desenvolvimento de determinados recursos em nossos softwares, precisamos garantir que um objeto seja instanciado apenas uma vez durante determinado ciclo, seja para evitar inconsistências como, por exemplo, um objeto que encapsule as configurações da aplicação, seja para evitar uso desnecessário de recursos caros, como conexões com o banco de dados.
...