Singletons em Javascript

Você já pensou em escrever uma classe considerando o padrão de projeto Singleton? Provavelmente você leu em algum lugar de que é impossível. Bem, não é bem assim. Talvez não haja uma maneira igual à da linguagem Java. Mas, de certa forma, é possível. Em um post anterior, eu comentei sobre uma nova forma de escrever classes em Javascript, e é usando esta forma que dá para escrever um Singleton. Veja este código:

Singleton = function() {

  // variáveis e método privados.

  var variavelprivada = 0;

  function funcaoprivada() {
  }

  // variáveis e métodos públicos.
  return {

    metodo: function() {
        alert("singleton");
    }

};
}();

Há uma pequena modificação com relação ao código do post anterior. Observe na última linha, logo após as chaves, os dois parênteses. O que aconteceu, então? Para entender melhor, é preciso compreender bem a linguagem Javascript. Já discuti em outros posts alguns destes detalhes. Inclusive, destaquei as diversas maneiras que você pode usar para escrever classes. Lembre-se que ao fazer algo do tipo f = function() {}, você já está, de certa forma, definindo uma classe. Você pode fazer, var objeto = new f(); e terá uma instância da classe f.

Com relação ao exemplo que escrevi, em um primeiro momento, você definiu uma classe com métodos privados e públicos. Quando você colocou os dois parênteses no final, você executou a função, fazendo que ela retornasse um Array de métodos (que define sua classe). Porque isto é um Singleton? Você não pode fazer new Singleton, porque, de fato, você não definiu uma classe que poderia ser instanciada. Para chamar os métodos, basta fazer Singleton.metodo(). Neste caso, você tem uma única instância da sua classe, satisfazendo ao que solicita o padrão de projeto.

×