Singletonパターンでのインスタンス受け渡し省略化
デザインパターンのうちの一つである Singletonパターンは「指定したクラスのインスタンスが一つしか存在しないことを保証したい」場合に用いる、と文献に書いてあります。Singletonを適用したクラスのインスタンスをnewで生成しようとするとコンパイラがエラーを出して知らせてくれる、というものです。この用途では、結構大規模なプロジェクトではないと Singletonパターンを利用することは無いかなあ、と当初は考えスルーしてしまっておりました。
しかし Singletonパターンを用いると「どのクラスからも直に Singletonパターンを用いたクラスのインスタンスを 取得する事が可能になる」という用途もあることに気づきました。
一つしかインスタンスを生成しないAというクラスがあり、クラスAの機能を利用したいBというクラスがあるとします。
クラスAに Singletonパターンを適用しない場合、クラスBは、どこかのクラスで一度生成されたクラスAのインスタンスを、引数経由で取得します。ここで、クラスBのインスタンスが Cというクラス内で生成され、クラスCはクラスAの機能をまったく利用しない場合、クラスCには クラスAのインスタンスをクラスBへ受け渡すための通路を用意する必要があり、クラスCには不必要なクラスAに関する記述を用意する必要がでてきてしまいます。
クラスAに Singletonパターンを適用する場合、クラスBは引数経由でクラスAのインスタンスを取得する必要がなくなります。ここで、クラスBのインスタンスが Cというクラス内で生成される場合、クラスC内にはクラスAに関する記述はまったく必要がなくなります。
Singletonパターンを用いた簡単な例は以下の通りです。AS3では Singletonパターンの記述がやや困難なものになるようなので AS2で記述しています。上記例で言うと、ControlクラスがA、PersonクラスががB、UserクラスがC、となります。Mainクラスが Controlクラス(A)とUserクラス(C)を生成するメインとなるクラスです。
PersonクラスがControlクラス内に設定された文字列を利用したい場合のプログラムです。
//メインクラス class Main { //初めに呼び出される public function Main(){ var ctrl:Control = Control.getInstance(); ctrl.init( "test" ); var user:User = new User(); } } //A : Singleton適用 class Control { private static var instance:Control = new Control(); private var str:String; public function get _str():String{ return this.str; } private function Control(){} public static function getInstance():Control{ return instance; } public function init( str:String ):Void{ this.str = str; } } //C : Bを生成するクラス class User { public function User(){ new Person(); } } //B : クラスAの機能を利用するクラス class Person { public function Person(){ var ctrl:Control = Control.getInstance(); trace(ctrl._str); //testと出力される } }
Singletonパターンを用いない場合、Controlクラスのインスタンスを Userクラスのコンストラクタに引数で受け渡し、UserクラスからPersonクラスのコンストラクタの引数へ Controlクラスのインスタンスを受け渡す、という記述になります。Userクラスでは Controlクラスの機能は利用しないのに Controlクラスに関する記述が必要になってしまいます。
■AS3でのSingletonパターン記述法
akihiro kamijo : コンストラクタ (と Singleton)
すみませんがここに書きます。
http://www.dango-itimi.com/jam/
このゲームのランキング1位のchinaはおかしくありませんか?
レベル5でこの状態は不正アクセスの香りが漂うのですがどう思いますか。
投稿者 にょ : 2007年02月02日 06:11