feb19.jp

Nobuhiro Takahashi
Designer / Engineer

AS2とAS3でSingletonクラスを作る

AS2とAS3でSingletonクラスを作る

各種DataManagerとか、レイアウト指定とか、SharedObjectとか、いろんなところに使えるデザインパターン「Singletonパターン」、AS2とAS3での実装例。

7.17更新! AS3版でコンパイルエラー出てました。。。すいません。asファイルからブログ用に書き直したときにarguments.calleeとしないといけない所を、arguments.callerとしていました。もし使おうと思って使っていただいた方にはご迷惑をおかけしました。。

ActionScript 2.0

使い方と、AS2のコードはこちら。

SingletonTest.as

class SingletonTest {
	private static var instance:SingletonTest;
	public static function getInstance():SingletonTest {
		if(SingletonTest.instance == null) {
			SingletonTest.instance = new SingletonTest();
		}
		return SingletonTest.instance;
	}
	private function SingletonTest() {
		init();
	}
	private function init():Void {
		//ここからいろいろ書く
	}
	//たとえば
	public var unko:Number = 20;
}

使い方

var st = SingletonTest.getInstance();
trace(st.unko);
st.unko = 21;
trace(st.unko);


ActionScript 3.0

AS3はコンストラクタ関数はprivate指定できないので、エラーを返すようにします。使い方はAS2と一緒。

SingletonTest.as

package {
	public class SingletonTest {
		private static var instance:SingletonTest;
		public static function getInstance():SingletonTest {
			if(instance == null) {
				instance = new SingletonTest(arguments.callee);
			}
			return instance;
		}
		public function SingletonTest(caller:Function = null) {
			if(caller != SingletonTest.getInstance) {
				throw new Error("SingletonTestクラスはSingletonクラスです。getInstance()メソッドを使ってインスタンス化してください。");
			}
			if(SingletonTest.instance != null) {
				throw new Error("SingletonTestインスタンスはひとつしか生成できません。");
			}
			
			init();
		}
		private function init():void {
			//ここからいろいろ書く
		}
	}
}

_parentとか、_rootとか使うぐらならSingletonを使ったほうがスマート。MovieClipとかの階層構造が基本的に関係ないから、階層構造をあとから変えてもコード変更しなくてよかったりしていろいろ便利ですよねん。コードの分離とかもできたりして、一石二鳥。

Navigation

prev: MacBook Proを買いました。
next: FlashPlayer 10 beta 2 が出てる

Recently Entries