Padrões de projeto em .NET: Singleton
Este padrão é utilizado para garantir que uma classe tenha somente uma instância e fornecer um ponto global de acesso para a mesma.
Este padrão é utilizado para garantir que uma classe tenha somente uma instância e fornecer um ponto global de acesso para a mesma.
É importante para algumas classes ter uma, e apenas uma, instância. Por exemplo, embora possam existir muitas impressoras em um sistema, deveria haver somente um spooler de impressoras. Da mesma forma, deveria haver somente um sistema de arquivos e um gerenciador de janelas. Um filtro digital terá somente um conversor A/D. Um sistema de contabilidade será dedicado a servir somente a uma companhia.
Como garantimos que uma classe tenha somente uma instância e que essa instância seja facilmente acessível? Uma variável global torna um objeto acessível, mas não impede você de instanciar múltiplos objetos.
Uma solução melhor seria tornar a própria classe responsável por manter o controle de sua única instância. A classe pode garantir que nenhuma outra instância seja criada (pela interceptação das solicitações para criação de novos objetos), bem como pode fornecer um meio para acessar sua única instância. Este é o padrão Singleton.
Quando usar Singleton?
Use o padrão Singleton quando:
- For preciso haver apenas uma instância de uma classe, e essa instância tiver que dar acesso aos clientes através de um ponto bem conhecido;
- A única instância tiver de ser extensível através de subclasses, possibilitando aos clientes usar uma instância estendida sem alterar o seu código.
Estrutura

- Singleton: define uma operação Instanciar que permite aos clientes acessarem sua única instância. Instanciar é uma operação de classe.
Conseqüências
O padrão Singleton apresenta vários benefícios:
- Acesso controlado à instância única: Como a classe Singleton encapsula a sua única instância, possui controle total sobre como e quando os clientes a acessam.
- Espaço de nomes reduzido: O padrão Singleton representa uma melhoria em relação ao uso de variáveis globais. Ele evita a poluição do espaço de nomes com variáveis globais que armazenam instâncias únicas.
- Permite um refinamento de operações e da representação: A classe Singleton pode ter subclasses e é fácil configurar uma aplicação com uma instância dessa classe estendida. Você pode configurar a aplicação com uma instância da classe de que necessita em tempo de execução.
- Permite um número variável de instâncias: O padrão torna fácil mudar de idéia, permitindo mais de uma instância da classe Singleton. Além disso, você pode usar a mesma abordagem para controlar o número de instâncias que a aplicação utiliza. Somente a operação que permite acesso à instância de Singleton necessita ser mudada.
- Mais flexível do que operações de classe: Uma outra maneira de empacotar a funcionalidade de um singleton é usando operações de classe. Porém, tal técnica torna difícil mudar um projeto para permitir mais que uma instância de uma classe.
Exemplo de código
Suponhamos que definimos uma classe DBFactory para construir objetos para acesso à bases de dados. DBFactory define uma interface para instanciação de objetos para acesso a diferentes bases de dados. As subclasses podem redefinir as operações para retornar instâncias especializadas, tal como SQLServerDB no lugar de simples objetos DataBase.
O fato relevante aqui é que a aplicação necessita somente de uma instância de uma fábrica de acesso a dados, e que esta instância deverá estar disponível para o código que realizar qualquer tipo de acesso a dados. É aí que o padrão Singleton entra. Ao tornar DBFactory um singleton, nós tornamos o objeto-database acessível globalmente sem recorrer a variáveis globais.
Para simplificar, suponhamos que nunca criaremos subclasses de DBFactory. Nós tornamos DBFactory uma classe Singleton em VB .NET, acrescentando uma operação estática Instanciar e um membro estático Instância para conter a única instância existente. Também devemos proteger o construtor para prevenir instanciações acidentais, as quais nos levariam a ter mais de uma instância.
Public Interface IDBFactory
Function Instanciar() As IDBFactory
End Interface
Public Class DBFactory
Implements IDBFactory
Private _Instancia As DBFactory
Public ReadOnly Property Instancia() As DBFactory
Get
Return _Instancia
End Get
End Property
Public Function Instanciar() As IDBFactory Implements
IDBFactory.Instanciar
If _Instancia Is Nothing Then
_Instancia = New DBFactory
End If
Return _Instancia
End Function
End Class
No próximo artigo estaremos analisando o primeiro dos padrões estruturais: Adapter.
Rafael Nascimento
Rafael Nascimento (rafabirth@hotmail.com), é Microsoft Certified Professional em Visual Basic .NET e líder da competência .NET em uma consultoria multinacional.
O que você achou deste post?
Cursos relacionados
Publicidade



