AS3 Singleton – Conceito e Exemplo

AS3 Singleton – Conceito e Exemplo

1. Conceito

Um dos pontos fortes do flex é o uso de uma linguagem completamente orientada a objectos, que nos permite criar classes comportando-se como objectos. Em muitos blogs encontra-se informação para o uso de este tipo de padrão singlton, mas muito poucos o explicam e por isso venho aqui criar um pequeno tutorial de como ela trabalha e pode ser util.

O conceito singleton é simples: Trata-se de uma class normal, mas que limita a sua instanciação a uma unica instancia. Ou seja, isto significa que se a class ja tiver sido atribuida ela não será atribuida de novo, nao será criada uma instancia nova, mas sim utilizada a que ja existe.

Quando criamos uma instancia de um object, por exemplo de um botão:

var btn:Button = new Button();

estamos a instanciar, (atribuir), uma nova instancia do botão que trará os valores por defeito da class button. Este exemplo numa class singleton não poderia ser possivel, deixamos de usar o new porque o nosso objectivo é usar a instancia que já existe. Aqui é que entra a class singleton, vejam o exemplo de uma class singleton (existem diferentes formas de a construir, esta é a que uso):

2.A Class singleton

package com.config
{
public class meuObjecto extends Object
{
public var variavelExemplo:String=”Ola Singleton”;

private static var instance:meuObjecto;
private static var allowInstantiation:Boolean;

public static function getInstance():meuObjecto {
if (instance == null) {
allowInstantiation = true;
instance = new meuObjecto();
allowInstantiation = false;
}
return instance;
}

public function meuObjecto():void {
if (!allowInstantiation) {
throw new Error(“Erro: Criação de instancia nao permitida: Use meuObjecto.getInstance() em vez de new.”);
}
}

}
}

Esta simples class verifica se o meuObjecto ja foi atribuido (new) e devolve a mesma instacia e propriedades do mesmo. Esta class não pode ser chamada usando o seguinte:

import com.config.meuObjecto;

var tmp:meuObjecto = new meuObjecto();

Isto resultará num erro: Erro: Criação de instancia nao permitida: Use meuObjecto.getInstance() em vez de new. que como o proprio erro indica, devemos usar:

var tmp:meuObjecto = meuObjecto.getInstance();

e desta forma criamos uma nova instancia (se ela nao existir) ou no caso de existir atribuimos a instancia existente ao tmp. Agora perguntam vocês, mas isto server para que?, aqui é que vem uma das centenas de aplicação:

3.Exemplo

vejamos o seguinte:

import com.config.meuObjecto;

var tmp:meuObjecto = new meuObjecto();

–> se fizermos trace(” -> “+tmp.variavelExemplo); teremos como output “Ola Singleton” certo?

–> se definirmos tmp.variavelExemplo=”Ola Mundo”; o mesmo trace(” -> “+tmp.variavelExemplo); devolvera “Ola Mundo” certo?

mas se fizermos o seguinte:

tmp.variavelExemplo=”Ola Mundo”;

var exemplo:meuObjecto = meuObjecto.getInstance();

O que aconteceu ao exemplo.variavelExemplo? normalmente deveria estar igual a “Ola Singleton” mas isto se usassemos o new, ao usar uma class singleton, é usada sempre a mesma instancia nas atribuições a novas variaveis, pelo que ficam com as caracteristicas existentes e definidas na class, ou seja, se fizermos:

–> trace(“->”+exemplo.variavelExemplo) teremos como output “Ola Mundo”.

Neste momento poderemos pensar em muitas aplicações, e uma das que uso bastante é usar uma class singleton para guardar dados que ficam disponiveis em toda a minha aplicação com um simples var variavel:meuObejcto = meuObjecto.getInstance();

Bastando colocar na class colocar na class as variaveis que queremos:

public var variavel1:String;

public var variavel2:String;

Esta definição de todas as variaveis na class tornaria muito exausto a criação da class, mas existe uma solução que ainda esta semana vou falar, trata-se de um pequeno truque em como podemos evitar estas declarações na class singleton e tornar tudo muito mais simples. Farei também um exemplo de como usar um ficheiro de configurações para encher uma class singleton para servir de class de configurações na nossa aplicação.

Espero que tenha sido util.

Cumprimentos.


6 comments

add yours
  • cyberfifa February 26, 2009

    Mais um bom tutorial…. Parabéns

  • […] tinha falado no post anterior, uma class singleton é muito util em muitos casos, mas deixa de ser tão util quando necessitamos […]

  • mo March 24, 2009

    umschreiben du musst

  • William Rafael March 30, 2009

    Olá Mário,

    achei interessante a sua implementação de singleton. Eu costumo usar uma implementação mais “amarrada” que acho que vale a pena citar:
    ==================================================
    class MeuObjeto{
    private static instance:MeuObjeto();

    // o construtor da classe utiliza a classe interna
    public meuObjeto( singleton:SingletonClass) {}

    public static function getInstance():MeuObjeto
    {
    if( instance == null)
    instance = new MeuObjeto( new SingletonClass());
    return instance;
    }

    }
    // sub-classe, interna ao arquivo
    class SingletonClass{}
    ==================================================
    Bom post!

  • Mário Santos April 1, 2009

    William,
    Valeu pelo código, pode ser que assim ajude mais alguém.
    Existem bastantes variações de classes singleton, eu uso a que falei em cima, uma questão de habito :)

    Abraço.

  • kixass April 15, 2009

    komm klar voll der mindfuck!
    was soll man daraus lernen?

Leave a Comment

Post