Desenvolvimento - C#

.Net Framework Inside : Singleton Design Pattern

Este Design Pattern garante a existência de um único e centralizado ponto de acesso a um determinado objeto e também uma única instância em memória que será compartilhada pelo domínio da aplicação.

por Guilherme Bacellar Moralez



Singleton What?

Este Design Pattern garante a existência de um único e centralizado ponto de acesso a um determinado objeto e também uma única instância em memória que será compartilhada pelo domínio da aplicação.

De fato que existem diversas abordagens para implementação de Singleton (eu mesmo conheço 3 delas), desta forma irei apresentar a abordagem que eu considero a “mais correta” e que eu uso em meus projetos.

Implementação na Prática

Em nossa implementação utilizaremos o diagrama de classes abaixo:

Em resumo, temos:

· Um (01) Construtor privado;

· Um (01) Campo estático com a instância da classe (neste momento, o construtor privado será acionado);

· Uma (01) Propriedade estática que devolve a referência para o campo estático;

Nosso código deverá ficar:

public sealed class FileLog

{

#region Singleton Pattern Code

      /// <summary>

      /// Contains a Singleton Class Instance

      /// </summary>

      private static FileLog _SingletonInstance = new FileLog();

      /// <summary>

      /// Retorna a Class Singleton Instance

      /// </summary>

      public static FileLog Instance

      {

            get { return _SingletonInstance; }

}

      /// <summary>

      /// Private Class Constructor

      /// </summary>

      private FileLog()

      {

      }

      #endregion

      public bool RealizaLog()

      {

            return true;

      }

}

Em C#

Public Class FileLog

#Region "Singleton Pattern Code"

    """ <summary>

    """ Contains a Singleton Class Instance

    """ </summary>

    """ <remarks></remarks>

    Private Shared _SingletonInstance As New FileLog

    """ <summary>

    """ Retorna a Class Singleton Instance

    """ </summary>

    """ <value></value>

    Public Shared ReadOnly Property Instance() As FileLog

        Get

            Return _SingletonInstance

        End Get

    End Property

    """ <summary>

    """ Private Class Constructor

    """ </summary>

    """ <remarks></remarks>

    Private Sub New()

    End Sub

    """ <summary>

    """ Realiza o Log no Arquivo

    """ </summary>

    """ <returns></returns>

    """ <remarks></remarks>

    Public Function RealizaLog() As Boolean

    End Function

#End Region

End Class

Em VB.NET

Podemos observar que neste modelo de implementação, a instância da classe Singleton será criada somente quando a classe (FileLog) por acessada pela primeira vez. E, ao contrário de outras implementações, não temos verificações (IF’s) desnecessários para a verificação e criação da instância.

Ganhamos ainda quando o quesito é Multi-Threading, pois não é necessário controle adicional para garantir uma única chamada ao construtor da classe Singleton.

Vale lembrar que, uma classe Singleton NÃO GARANTE que seus métodos sejam SingleCall (ThreadSafe), para tanto, controles adicionais deverão ser realizados pelo(s) programador(es) responsável(is) pelos métodos.

Consumindo um Singleton

static void Main(string[] args)

{

FileLog.Instance.RealizaLog();

}

Em C#

Sub Main()

FileLog.Instance.RealizaLog()

End Sub

Em VB.NET

Quando Usar?

A utilização de Singleton é mais usual (aqui não existem regras, nem o certo e errado) em situações que em que um ponto centralizado de acesso a determinados métodos são necessários.

Como exemplo podemos utilizar uma classe de Log em arquivo texto (a do exemplo deste artigo), classes de validação de regra de negócio (as minhas preferidas para uso do Singleton) ou classes de envio de email.

Estes exemplos (acredito eu) são uma base interessante para a exploração do potencial deste simples Design Pattern.

Então, boa diversão.

E lembre-se: Invente, Tente. Use um Design Pattern de maneira diferente.

Guilherme Bacellar Moralez

Guilherme Bacellar Moralez - Bacharel em Ciências da Computação, Desenvolvedor .NET há 4 anos, MCAD, Autor de Livros e Artigos, Arquiteto de Software do Projeto D.NET (Framework de Desenvolvimento .NET).
Blog:
http://dotnetmax.bacellar.org/