- Garantir que um e somente um objeto da classe seja criado;
- Oferecer um ponto de acesso para um objeto que seja global no programa;
- Controlar o acesso concorrente a recursos compartilhados.
- No Classic Singleton, sobrescrevemos o método new (método especial de Python para instanciar objetos) para controlar a criação do objeto. O objeto é criado com o método new, mas antes disso é feita uma verificação para saber se o objeto já existe. O método hasattr (método especial de Python para saber se um objeto tem determinada propriedade) é usado para verificar se o objeto cls tem a propriedade instance, que confere se a classe já tem um objeto. No momento em que o objeto s1 é solicitado, hasattr() detecta que um objeto já existe e, então, s1 aloca a instância do objeto existente.
- Code
- No LazySingleton, quando fazemos s=LazySingleton(), o método init é chamado, mas nenhum objeto novo é criado. Entretanto a criação propriamente dita do objeto ocorre quando chamamos LazySingleton.getInstance().
- Code
- O conceito de Monostate é que a instancia deve ter o mesmo estado e comportamento, e não a mesma identidade.
- No código atribuímos a variável de classe __shared_state à variável __dict__ (uma variável especial em Python). Python usa __dict__ para armazenar o estado de todos os objetos de uma classe. No código a seguir, atribuímos __shared_state propositalmente a todas as instâncias criadas. Então, se criarmos duas instâncias 'b' e 'b1', teremos dois objetos distintos, de modo diferente do Singleton, em que temos apenas um objeto. Entretanto os estados dos objetos, b.__dict__ e b1.__dict__, são iguais. Mesmo que a variável x do objeto mude para o objeto b, a mudança será copiada para a variável __dict__ compartilhada entre todos os objetos, e até mesmo b1 obterá a mudança de x de um para quatro.
- Code
- Aplicação de banco de dados usando singleton.
- Criamos uma metaclasse chamada
MetaSingleton
. O método especial __call__ de Python é usado na metaclasse para criar um Singleton. - A classe
Database
está decorada com a classeMetaSingleton
e começa a agir como um Singleton. Assim, quando a classeDatabase
é instanciada, ela cria apenas um objeto. - Quando a aplicação web quiser executar determinadas operações no banco de dados, ela instanciará a classe de banco de dados várias vezes, mas somente um objeto será criado. Como existe apenas um objeto, as chamadas ao banco de dados serão sincronizadas. Além do mais, isso não é custoso para os recursos do sistema, e podemos evitar problemas com recursos de memória ou CPU.
- Criamos uma metaclasse chamada
- Code