Criando um Singleton em Action Script

{lang: 'pt-BR'}

Para os marinheiros de primeira viagem, Singleton é um padrão de projeto que permite criar classes que dêem origem a apenas um objeto. Isso é bastante útil para definir classes de controle, ou classes que conterão dados que serão compartilhados por toda a aplicação.

O princípio básico de criação do Singleton é não permitir que o usuário da classe instancie a classe diretamente. Desta forma, o usuário terá que chamar algum método que retorne a instância dessa class. A maneira mais comum de fazer isso é definir o construtor da classe como privado e criar um método estático que retorne a única instância da classe. O problema é que em Action Script não é possível criar construtores privados. O que fazer?

Existe uma outra maneira de inviabilizar a instaciação de uma classe: Basta que utilizemos um parâmetro no construtor, de um tipo inacessível por qualquer outra classe, que não a própria. Hein? Pois é, vamos criar um parâmetro de um tipo, por exemplo, SingletonEnforcer. Esse tipo é uma classe definida sem pacote e sem visibilidade. Isso significa que somente a classe que estamos criando será capaz de criar um objeto do tipo SingletonEnforcer. Pronto. Já temos nosso artifício que impede que um usuário instancie a classe diretamente. Vejam o código e percebam a definição da classe SingletonEnforcer no final do arquivo:

package org.example
{
 public class MeuSingleton
 {

  private static var _instance:MeuSingleton;

  public var dados:Object;

  public function MeuSingleton(enforcer:SingletonEnforcer) {
   if (enforcer==null){
    throw new Error("Não é possível instanciar a classe MeuSingleton diretamente");
   }
  }

  public function get instance():MeuSingleton{
   if (_instance == null){
    _instance = new MeuSingleton(new SingletonEnforcer);
   }
   return _instance;
  }

 }
}

class SingletonEnforcer{ }

Para acessar a instância do objeto, faça:

import org.example.MeuSingleton;
MeuSingleton.instance.dados = "Olá pessoal!";

Atenção: Use o padrão Singleton com parsimônia. O uso indiscriminado de Singletons torna o código altamente acoplado e é considerado uma prática ruim de programação. O Singleton deve ser usado com cautela. Eu atualmente prefiro usar um container IoC que me permite fazer Injeção de Dependências. É o caso do Swiz, mas isso eu deixo para um outro post.

{lang: 'pt-BR'}