Flex/ Flex 3 how to

#1 Flex 3 How to : Implementar Singleton em Actionscript 3.0

Quem trabalha com C++, C# e Java, sentiu falta de alguns recursos que o Actionscript 3.0 falta. Dentre eles estão construtores (privados, protegidos), singletons, compositions entre outros recursos que existem nas linguagens mencionadas acima.
O fator que distingue essa falta de recursos é a limitação descrita em suas especificações que vem lá do Ecmascript-262 versão 3 do documento que declara os recursos existentes para linguagens scripts não só em AS3 mais também em Javascript,DMDScript, Javascript.Net, etc.
Porém nada está perdido, existem várias maneiras de enganar o compilador do Actionscript que vem junto ao Flex SDK para que isso ocorra, lembrando que fazendo isso você está apenas contornando o problema, sem muitas percas ou mal funcionabilidades.

Como criar Singleton em Actionscript 3.0?

Singleton é um modelo de design pattern que simplifica o acesso ao objeto com apenas uma instância ao modo geral da aplicação.
Em um modelo real, imagine ipoteticamente que um singleton é sua maneira única de agir, se comportar e falar, ninguém no mundo pode instânciar essa maneira que você tem de fazer as coisas, porém elas podem ser usadas por outras pessoas no mundo, um modelo a ser copiado porém sempre preservando de onde elas vieram.
É assim que singletons atuam, você precisa apenas instancia-los uma vez e ele faz o papel dele.
As classes que vem no Flex SDK não tem esse papel de singleton, alguns críticos acham que singleton é perca de tempo, optimização e recursos de um sistema não necessário à se ter.
Discordações a parte cada modelo de design pattern é aplicável em diferentes formas de elaborar um software, e tampouco pode ser ignorado as diferentes maneiras de serem aplicaveis, vai de cada recurso que elas necessitam.

Na própria página da Wikipedia existe um modelo de singleton em Actionscript 3.0 que podemos usar para esse exemplo.

Paso-a-passo:

1 – Crie um novo projeto Flex no seu Flex Builder
2 – Crie uma nova classe em Actionscript 3.0 e dê o nome “Singleton”.
3 – Adicione o seguinte código em sua classe.


package br.com.igorcosta.howto{
	public class Singleton {

		private static var instance:Singleton;

		public function Singleton(enforcer:SingletonEnforcer){
			if (enforcer == null)
				throw new Error("Só pode haver uma instância de Singleton");
		}

		public static function getInstance() : Singleton {
			if (instance == null)
				instance = new Singleton( new SingletonEnforcer );
			return instance;
		}
	}
}
//Para bloquear o acesso ao constructor.
class SingletonEnforcer {

}

Uma vez feito isso seu Singleton está pronto para ser usado, você pode usar essa mesma classe em outras classes para implementar o singleton nelas, um exemplo típico é os Models que trafegam entre o lado cliente e o servidor.

Como aplicar essa Classe Singleton em sua aplicação Flex?

< ?xml version="1.0" encoding="utf-8"?>

	
		< ![CDATA[

			import br.com.igorcosta.howto.Singleton;

			public var instancia:Singleton = Singleton.getInstance();

			public function acessar():void{
					instancia.PropriedadesFuturas = // você pode definir propriedades
			}
		]]>
	


Ao invés de sempre usar public var obj:Object = new Object(); Você passa a usar a instância já pre-estabelecida para aquila classe em geral, por exemplo:

Criar um model que tenha algumas procidades e que essas possam ser acessadas por outras classes.

Classe Singleton: Modelo

package  br.com.igorcosta.howto.models{

	public class Modelo {



		// Propriedades publicas

		public var X:Number;
		public var Y:Number;
		public var Largura:Number;
		public var Altura:Number;

		private static var instance:Modelo;


		public function Modelo(enforcer:SingletonEnforcer){
			if (enforcer == null)
				throw new Error("Só pode haver uma instância de Singleton");
		}

		public static function getInstance() : Modelo {
			if (instance == null)
				instance = new Modelo( new SingletonEnforcer );
			return instance;
		}
	}
}
//Para bloquear o acesso ao constructor.
class SingletonEnforcer {

}

Cliente acessando pela instância e setando o valor de cada propriedade do Singleton Modelo:

< ?xml version="1.0" encoding="utf-8"?>

	
		< ![CDATA[
			import mx.controls.Alert;
			import br.com.igorcosta.howto.models.Modelo;

				//instanciar o singleton Modelo

				public var instancia:Modelo = Modelo.getInstance();

				public function setarPropriedades():void {
					instancia.Altura = painel.height;
					instancia.Largura = painel.width;
					instancia.X = painel.x;
					instancia.Y = painel.y;
					Alert.show("Altura:"+instancia.Altura+ "n"+"Largura:"+instancia.Largura+
					"n"+"Posicao X:"+instancia.X+"n"+"Posicao Y:"+instancia.Y);


				}
		]]>
	
		
		

Veja aqui também outras maneiras de implementar Singletons em Actionscript 3.0.

2 thoughts on “#1 Flex 3 How to : Implementar Singleton em Actionscript 3.0

  1. Olá Igor… as propriedades X, Y, Largura e Altura não teriam que ser do tipo static, para serem acessadas e setadas por outra classe?

  2. Rssss… desculpa Igor viajei aqui… declarei elas como private… aí fica impossível acessar mesmo! Funcionou perfeitamente seu exemplo aqui, fiz um singleton de uma conexão com o Wonza Media Server…

Comments are closed.