デザインパターン(Singleton)

ActionScript2.0の書き方(デザインパターン)で、
Singletonというのがあります。

これがめちゃくちゃ便利。




インスタンスが作成されるのを一個のみにしたい時に使うパターン、


というのが本来の使い方で、要はSWFのどこでクラスを呼び出そうが
どこでも同じインスタンスを生成できるというものです。




例としては、色んな場所にスクリプトを書いて
クラスを作っていったりすると、_globalや_rootで
指定する箇所がやむを得ず出てきます。


ハードコーディングしているみたいで、あまりよろしくないです。




そこでSingletonってやつを使うならば、


例えば1フレームで作成したインスタンス
_rootの孫MCあたりでも全く同じインスタンスを呼び出せます。



例です↓

//_rootフレームに以下のActionScriptを記述。


//例1 : newを使う方法
var ルートのインスタンス = new YourClass();

_root.createEmptyMovieClip( "子供" , 0 );
_root.子供.createEmptyMovieClip( "孫" , 0 );
_root.子供.孫.孫のインスタンス = new YourClass();

trace( ルートのインスタンス == _root.子供.孫.孫のインスタンス );
//false ←違う場所にインスタンスを作っているので当然違うものになります。



//例2 : Singletonを使う方法
var ルートのインスタンス = MyClass.getInstance();

_root.createEmptyMovieClip( "子供" , 0 );
_root.子供.createEmptyMovieClip( "孫" , 0 );
_root.子供.孫.孫のインスタンス = MyClass.getInstance();

trace( ルートのインスタンス == _root.子供.孫.孫のインスタンス );
//true ←違う場所で作っているのに、同じになりました!




//例3 : _globalを使う方法
var ルートのインスタンス = _global.グローバルなインスタンス = new MyClass();

_root.createEmptyMovieClip( "子供" , 0 );
_root.子供.createEmptyMovieClip( "孫" , 0 );
_root.子供.孫.孫のインスタンス = _global.グローバルなインスタンス;

trace( ルートのインスタンス == _root.子供.孫.孫のインスタンス );
//true ←_globalから代入しているからとりあえずOK。でも色んなところにインスタンスが散らかるのでスマートじゃない。



getInstance()を使えば、
ルートのインスタンスも、孫MCのインスタンスも同じものが作れてしまう(呼び出される)んですね。



これは重宝します。





ただ、クラスにはこんなかんじでSingletonを実装しなければなりません。
ちょっとスクリプトが増えますが、バグの混入を防げそうでお勧めです。

class MyClass
{
	private static var _instance:MyClass; //private , staticにするところがミソ	
	
	/**
	 * Constructor
	 */
	private function MyClass() //private にするところがミソ。自分自身以外からnew演算子をさせなくします。
	{}
	
	/**
	 * Singleton Patern
	 */	
	public static function getInstance() :MyClass
	{
		//インスタンスがなければ作成。二度目はif文は実行されないので、一度しかnewされません。
		if( _instance == undefined ) _instance = new MyClass(); 
		
		return _instance;
	}
}


参考:ActionScript3.0ではちょっとこれをやるのはややこしくなるようです。
http://weblogs.macromedia.com/akamijo/archives/2005/12/interface.cfm

関連記事 :
2007-01-14 - Yasu Log::Flash/Flex/AIR::ブログ
ActionScript Editor - Yasu Log::Flash/Flex/AIR::ブログ
ループ文速度比較 - Yasu Log::Flash/Flex/AIR::ブログ