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