Design Patterns – Parte 1 – Singleton

by Cássio R Eskelsen 15. setembro 2008 05:43

No post “Linq to SQL Context único por aplicação” demonstrei a utilização de um Singleton para disponibilizar um único Linq Context por aplicação.

Para muitos é óbvio o que é um Singleton bem como um Design Pattern. No entanto, pensando em quem não conhece muito bem esses conceitos resolvi criar uma série de posts para demonstrar alguns dos principais design patterns que podemos usar no dia a dia.

Primeiramente, o que é um Design Pattern? Segundo a Wikipédia,Design Patterns, descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos”.
Ou seja, são peças de código, estratégias de resolução, etc, que nos poupam tempo na resolução de problemas pelos quais outros desenvolvedores já passaram. Essas soluções são amplamente utilizadas e testadas, não havendo, geralmente, contestações sobre o seu funcionamento.

Acredito que o maior problema com relação aos DP (Design Patterns) seja “quando” utilizá-los. Percebo que há muita confusão com relação a isso, devido principalmente quando se tenta utilizá-los a qualquer custo, apenas para estar “na moda”.

A primeira coisa que você precisa saber sobre os Design Patterns é: design patterns se encaixam na categoria best practices, ou seja, seria bom se você utilizasse, mas você não será condenado à forca caso não utilize.

Em seguida, você deve saber que deve procurar um design pattern para um problema, não o contrário, ou seja, achar algum problema para tentar enquadrá-lo sob um Design Pattern. Essa última situação é a mais comum quando se tenta apenas seguir a moda.

Sugiro que você procure ter uma visão geral sobre os principais Design Patterns para que no momento em que precisar de algum deles você tenha a percepção “automática” de que ele pode ser auxiliado por algo que outro desenvolvedor já pensou.

Design Patterns normalmente são independentes de linguagem, mas a implementação deles pode variar de acordo com os recursos disponíveis em cada linguagem. Obviamente aqui irei focar em C#.

Primeiro Pattern: Singleton

Quando usar: Quando você precisa e/ou deve ter apenas uma instância de uma classe em sua aplicação.

Uma das características básicas da OO é a necessidade de instanciarmos um objeto. No entanto, as vezes precisamos manter uma instância única de um objeto para toda a aplicação, como é o caso relatado no post “Linq to SQL Context único por aplicação

Alguns sugerem a criação de “variáveis globais”(que no C# são possíveis através da criação de variáveis estáticas em alguma classe). No entanto, além de não ser elegante, há um desperdício de recursos já que os campos estáticos estão sempre disponíveis, não importando se serão usados ou não. No caso do singleton, você pode fazer com que os recursos sejam alocados apenas quando da primeira utilização.

Grosso modo, um singleton normalmente é composto de no mínimo uma instância privada do objeto que se quer compartilhar(o singleton) e um método estático que terá a função de criar e disponibilizar essa instância.

A garantia de que o objeto é único é dada pela não disponibilização de um construtor público. O acesso será feito sempre pelo método estático público do Singleton.

Veja um exemplo abaixo:

using System;

namespace Singleton
{
    class Program
    {
        static void Main(string[] args)
        {
            Singleton a = Singleton.GetInstance();
            Singleton b = Singleton.GetInstance();

            Console.WriteLine("você verá que abaixo será mostrado o valor True");
            Console.WriteLine(a == b);
            Console.ReadLine();
        }
    }

    public class Singleton
    {
        /// <summary>
        /// O próprio .Net cuida para que a variável "instancia" seja criada de 
        /// uma forma segura, ou seja, não teremos problemas se dois pontos 
        /// diferentes de nosso sistema chamarem o singleton ao mesmo tempo
        /// </summary>
        private static Singleton instancia = new Singleton();

        /// <summary>
        /// Construtor protected, assim ninguém poderá instanciar o singleton "por fora"
        /// </summary>
        protected Singleton()
        { 

        }

        public static Singleton GetInstance()
        { 
            return instancia;
        }
    }
}

Dúvidas? deixe um comentário!

5.0 ponto(s). Avaliado por 1 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

.Net | Design Pattern

Comentar


(Vai mostrar seu Gravatar)  

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading