C# Singleton

Resumo : neste tutorial, você aprenderá como usar o padrão C# Singleton para garantir que uma classe tenha apenas uma instância.

Introdução ao padrão C# Singleton

Às vezes, você precisa criar uma e apenas uma instância de uma classe . A razão é que a criação de múltiplas instâncias de tal classe pode levar a problemas como dados incorretos ou contenção de recursos. Por exemplo, quando você trabalha com uma estrutura de log ou conexão de banco de dados.

O padrão Singleton resolve o problema de criação de uma única instância de uma classe que deve ser acessível globalmente em toda a aplicação.

Por definição, o padrão Singleton é um padrão de design criacional que permite que uma classe tenha apenas uma instância e fornece um ponto global de acesso a essa instância.

O diagrama UML a seguir ilustra o padrão Singleton:

O padrão Singleton consiste em uma única classe responsável por criar e manter uma única instância.

Os participantes do padrão Singleton são:

  • Singleton: é uma classe para criar e manter a instância única.
  • Client: é a classe que usa a instância Singleton.

A Singletonclasse é responsável por criar uma única instância. A Clientclasse obtém a Singletoninstância chamando o Instanceacessador ou GetInstance()método.

A Singletonclasse possui um construtor marcado como privado. Isso evita que outras classes criem instâncias da Singletonclasse.

A Singletonclasse também possui um acessador que fornece acesso à instância.

Prós e contras do padrão Singleton

O padrão Singleton oferece os seguintes benefícios:

  • Garante que apenas uma instância da classe seja criada.
  • Fornece um ponto global de acesso à instância.
  • Fornece uma maneira de controlar o acesso à instância.

Além dos benefícios acima, o padrão Singleton tem as seguintes desvantagens:

  • Difícil de testar. O padrão Singleton pode dificultar os testes. Porque o padrão Singleton cria um ponto global de acesso à instância, o que leva a dependências inesperadas em casos de teste.
  • Leva a um forte acoplamento entre as classes. As classes que dependem da instância Singleton sabem de sua existência e de como acessá-la, o que pode levar a um forte acoplamento entre as classes. Como resultado, é difícil alterar a classe Singleton ou as classes que dependem da classe Singleton sem afetar outras partes do sistema.

Implementação singleton em C#

O seguinte ilustra como usar a implementação do padrão Singleton em C#:

sealed class Singleton
{
    private static Singleton? _instance;

    public static Singleton Instance
    {
        get
        {
            _instance ??= new Singleton();
            return _instance;
        }
    }

    private Singleton()
    {
    }
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina a Singletonclasse com a sealedpalavra-chave para que outras classes não possam herdar desta classe.

Segundo, declare um static privatecampo com o tipo Singletonchamado _instance.

Terceiro, defina o acessador que cria uma instância da Singletonclasse, se for null; caso contrário, retorne a instância. Este acessador é a única maneira de acessar a Singletoninstância.

Por fim, marque o construtor da Singletonclasse para privateevitar que outras classes criem uma nova instância da Singletonclasse.

Exemplo de singleton C#

O programa a seguir demonstra como aplicar o padrão Singleton para definir uma Loggerclasse que possui uma e apenas uma instância em toda a aplicação:

namespace DP;

sealed class Logger
{
    private static Logger? _instance;
    public static Logger Instance
    {
        get
        {
            _instance ??= new Logger();
            return _instance;
        }
    }

    private Logger()
    {
    }

    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        var logger = Logger.Instance;
        logger.Log("C# Singleton");
    }
}Linguagem de código:  C#  ( cs )

Saída:

C# SingletonLinguagem de código:  C#  ( cs )

Aplicativos singleton

Aqui estão algumas aplicações práticas do padrão Singleton:

  • Gerenciando recursos como pools de threads, conexões de banco de dados e caches.
  • Estruturas de registro e auditoria que precisam manter um único registro ou trilha de auditoria em todo o sistema.
  • Gerenciamento de configuração, onde você precisa de uma e apenas uma instância do gerenciador de configuração que seja acessível de qualquer parte do sistema.

Resumo

  • Use o padrão Singleton para garantir que uma classe tenha uma e somente uma instância por meio do aplicativo.
  • O Singleton pode dificultar o teste do aplicativo e pode levar a um forte acoplamento entre as classes.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *