Labo

AS3でSingleton パターン

Singletonパターンは、インスタンスを1個しか生成しないこと
(より広い意味では、生成できるインスタンスの個数に制限があること)を、
クラスデザインとして表現するパターンです。

目的としては
*変数などをどのクラスからでも簡単に参照したい→データ保持用のクラスプロパティなどを作る
*外部からのインスタンス生成を阻止。内部でひとつ作ってしまい。それを外部からコントロール可能にする。

シングルトンクラスの実装。
*コンストラクタの直接呼び出し時にはエラーを投げるようにする。
*コンストラクタが直接呼び出されたのか、インスタンス返却メソッド経由で呼び出されたかを判断する。
*インスタンス返却メソッドが呼ばれた場合、インスタンスが既に作成済みかチェックしインスタンスを返します。(内部的にすでに作成済)


------------------------------------------------- 
Singleton.as
------------------------------------------------- 

//Singletonパターンを使ってどのシーンからも変数を参照できるようにする。

package classes{
	import flash.display.Sprite;

	public class Singleton extends Sprite {

		//インスタンス生成阻止用のクラスプロパティ
		/* 後からインスタンスがすでに作られているかどうか判定するので、
		  内部で最初に自分自身のインスタンスをひとつ作ってしまう。*/
		private static  var _instance:Singleton=new Singleton  ;

		//外部から直接アクセス用のクラスプロパティ
		public static  var test:String="testttt";

		//インスタンスプロパティ
		//private var constPropaty:String;


		function Singleton():void {
			//すでにインスタンスを生成された履歴があれば、エラーを返す = インスタンス生成にロック
			if (_instance) {
				throw new ArgumentError("Singleton クラスは外部からインスタンス化できません。");
			}
			//赤い四角を描画。
			graphics.beginFill(0xFF0000);
			graphics.drawRect(0,0,100,100);
			graphics.endFill();

		}
		//クラスメソッド
		/*インスタンスを参照したい場合、例えばこのクラスのコンストラクタで実行された
		 内容を参照したい場合は「_instance」から間接的に参照するようにする。
		 インスタンスはひとつしか生成されない。すでに内部で生成済み*/
		public static  function get instance():Singleton {

			return _instance;

		}
	}
}

------------------------------------------------- 
Main.as(ドキュメントクラス)
------------------------------------------------- 

package classes{

	import flash.display.MovieClip;
	import flash.events.MouseEvent;


	public class Main extends MovieClip {

		function Main():void {
			init();
		}
		private function init():void {
			btn1_mc.buttonMode=btn2_mc.buttonMode=btn3_mc.buttonMode=true;

			//
			btn1_mc.addEventListener(MouseEvent.CLICK,click1);
			btn2_mc.addEventListener(MouseEvent.CLICK,click2);
			btn3_mc.addEventListener(MouseEvent.CLICK,click3);
		}
		private function click1(e:MouseEvent):void {

			trace(Singleton.test);
			Singleton.test="テスト";

			//シングルトンクラス内部のインスタンスを参照
			var singleton1:Singleton=Singleton.instance;
			addChild(singleton1);
			singleton1.x=singleton1.y=0;

			//シングルトンクラス内部のインスタンスを参照
			//singleton1とsingleton2は同じインスタンスを参照しているため、
			//結局(200,200)の位置に赤い四角が一つ表示される。
			var singleton2:Singleton=Singleton.instance;
			addChild(singleton2);
			singleton1.x=singleton1.y=300;

			//var singleton3 = new Singleton();

		}
		private function click2(e:MouseEvent):void {
			trace(Singleton.test);
		}
		private function click3(e:MouseEvent):void {
			trace(Singleton.test);
		}

	}
}

【参考サイト】
□カヤック:
http://level0.kayac.com/2009/02/progressionsingleton.php

□Wiki:
http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

□unbland.org blog &raquo:
http://unbland.org/blog/2008/10/23/160.html

□moriBlog:
http://moringo.moo.jp/wordpress/?p=156

□feb19.jp blog
http://feb19.jp/blog/archives/000147.php

09.08.18.PM06:12

Track Back

http://plamo-tokyo.com/site/mt-tb.cgi/67