DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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

 rnppsingfig01.jpg

       
  • 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?

    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03