Definição
Assegura de que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela.
Estrutura de código do Singleton
Este código estrutural demonstra o padrão Singleton que garante que apenas uma única instância (o singleton) da classe possa ser criada.
// Program.cs
using System;
namespace ConsoleApp
{
/// <summary>
/// Classe de inicialização do MainApp para Design Pattern: Singleton
/// </summary>
class MainApp
{
static void Main()
{
// Constructor é protegido, não é possível utilizar o new
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();
// Verifica se os objetos são da mesma instância
if (s1 == s2)
Console.WriteLine("Objetos são da mesma instância");
// Aguarda a interação do usuário para exibir a mensagem
Console.ReadKey();
}
}
/// <summary>
/// A classe Singleton
/// </summary>
class Singleton
{
private static Singleton _instance;
// Constructor é 'protegido'
protected Singleton() { }
public static Singleton Instance()
{
// Nota: isto não é thread safe.
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
}
Resultado:
Objetos são da mesma instância
Exemplo básico de utilização do Singleton
Nesse exemplo vamos escrever um programa que utilizando o Singleton e irá imitar o Bart Simpson escrevendo a mesma mensagem no quadro

// LogManager.cs
using System;
using System.IO;
using System.Text;
namespace ConsoleApp
{
/// <summary>
/// The Singleton Class
/// </summary>
public class LogManager
{
private LogManager()
{
fileStream = File.OpenWrite(GetExecutionFolder() + "\\Application.log");
streamWriter = new StreamWriter(fileStream);
}
private string GetExecutionFolder()
{
return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
private FileStream fileStream;
private StreamWriter streamWriter;
private static LogManager _instance;
public static LogManager Instance
{
get
{
// Note: this is not thread safe.
if (_instance == null)
_instance = new LogManager();
return _instance;
}
}
public void WriteLog(string content)
{
StringBuilder message = new StringBuilder();
message.AppendLine(string.Format("Date: {0}", DateTime.Now.ToString()));
message.AppendLine(string.Format("Message: {0}", content));
streamWriter.WriteLine(message.ToString());
streamWriter.Flush();
}
}
}
// Program.cs
namespace ConsoleApp
{
class Program
{
static void Main()
{
// Para exemplo vamos imitar o Bart Simpson e fazer o programa
// escrever no quadro 3x a mesma mensagem
for (int i = 0; i < 3; i++)
{
System.Threading.Thread.Sleep(1000); // Aguarda 1 segundo antes de escrever novamente
LogManager.Instance.WriteLog("Nunca esquecer do Singleton Design Pattern");
}
}
}
}
Resultado:
Date: 09/05/2018 11:24:22 – Message: Nunca esquecer do Singleton Design Pattern
Date: 09/05/2018 11:24:23 – Message: Nunca esquecer do Singleton Design Pattern
Date: 09/05/2018 11:24:24 – Message: Nunca esquecer do Singleton Design Pattern
Deixe um comentário