Design Patterns – Singleton

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 uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *