feeds2011/07/19カテゴリー:ActionScriptActionScript3.0におけるSingletonパターンTweetSingletonパターンとは、クラスのインスタンスが一つしか生成されないことを保証するデザインパターンの一種です。ActionScript3.0では、コンストラクタにアクセス制御の属性としてprivateを指定することができないため、Singletonパターンを実装するためには、ちょっとした工夫が必要になります。AS3におけるSingletonパターンの実装方法も色々と存在していますが、その中で代表的なものを見てみます。目次privateクラスを利用した実装方法private静的(static)プロパティのフラグを利用した実装方法インスタンス格納用プロパティ宣言時にコンストラクタを呼ぶ実装方法privateクラスを利用した実装方法ActionScript3.0では、クラスに対してもprivate属性を指定することができません。package{}の外にクラスの定義を記述することで事実上のprivateクラスとなります。このprivateクラスをコンストラクタの引数に使用することでSingletonパターンを実装することができます。{}下記コードをテストすると、Singleton1クラスのコンストラクタのtrace文は一度しか出力されません。singleton1Aとsingleton1Bを==比較演算子で比べるとtrueが出力され、同じインスタンスを参照していることがわかります。1行目のコメントアウトを解除し実行するとコンパイルエラーとなります。これは、package{}の外側に記述したPrivateClassは、Singleton1.as以外からは参照することが不可能なため、事実上のprivateクラスとなっているからです。Singleton1]true*/なお、こういったprivateクラスの使用は、ActionScript3.0のクラスファイルの特性上、第3者にとって解りづらくなりがちなので注意が必要です。次は、private静的(static)プロパティのフラグを利用した実装方法を見てみます。クラス内部からの呼び出しであるかを示すフラグとして、private静的プロパティをBoolean型で宣言し、初期値としてfalseを代入しておきます。getInstance()が呼ばれた際に、インスタンスが生成されていない場合は、このフラグをtrueにしてコンストラクタを呼び出します。}}下記コードを実行するとSingleton2クラスのコンストラクタのtrace文は一度しか出力されず、またsingleton2Aとsingleton2Bを==比較演算子で比べたtraceもtrueが出力され、同じインスタンスを参照していることがわかります。1行目のコメントアウトを解除し実行すると内部呼び出しのフラグがfalseであるため、IllegalOperationErrorがthrowされます。Singleton2]true*/インスタンス格納用プロパティ宣言時にコンストラクタを呼ぶ実装方法Singletonパターンの特徴として、必ずstaticプロパティに自身のインスタンスを格納します。次の例は、インスタンス格納用プロパティ宣言時にコンストラクタを呼ぶ方法です。クラスの初期化時にインスタンスが作成されるので、以降に外部からコンストラクタが呼ばれた場合は、IllegalOperationErrorがthrowされます。}}Singleton3クラスのインスタンスは、クラスの初期化時に一度だけ生成され、そのインスタンスがgetInstance()により返されるので、下記コードを実行すると、singleton3Aとsingleton3Bの比較演算子はtrueが出力され、同じインスタンスを参照していることが確認できます。1行目のコメントアウトを解除し、コンストラクタを実行するとIllegalOperationErrorがthrowされます。Singleton3]true*/以上、ActionScript3.0におけるSingletonパターンの実装方法を見てきましたが、Singletonパターンはstaticメソッドにより、どこからでもインスタンスを取得できるので非常に使い勝手がよいです。インスタンスは唯一の存在であることが保証されるので、複数人で作業する場合も安心して使用できます。Singletonパターンのようなデザインパターンは、先人の知恵の結集とも言えるので、効率的なプログラミングをするために、一冊参考書でも買って勉強したいなと思う今日この頃です。