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 Singleton
classe é responsável por criar uma única instância. A Client
classe obtém a Singleton
instância chamando o Instance
acessador ou GetInstance()
método.
A Singleton
classe possui um construtor marcado como privado. Isso evita que outras classes criem instâncias da Singleton
classe.
A Singleton
classe 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 Singleton
classe com a sealed
palavra-chave para que outras classes não possam herdar desta classe.
Segundo, declare um static private
campo com o tipo Singleton
chamado _instance
.
Terceiro, defina o acessador que cria uma instância da Singleton
classe, se for null
; caso contrário, retorne a instância. Este acessador é a única maneira de acessar a Singleton
instância.
Por fim, marque o construtor da Singleton
classe para private
evitar que outras classes criem uma nova instância da Singleton
classe.
Exemplo de singleton C#
O programa a seguir demonstra como aplicar o padrão Singleton para definir uma Logger
classe 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# Singleton
Linguagem 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.