シングルトンの実装
あるクラスのオブジェクト(インスタンス)をひとつに限定したい場合のプログラム設計方法として、シングルトンパターン (singleton pattern) という設計パターンがあります。
ここでは JavaScript でシングルトンを実装する方法を示します。
C# や Java でのシングルトンの実装方法
C# などの class キーワードでクラスを定義する言語の場合、シングルトンを実装する場合の基本的な方法は次のようなものです。
まずコンストラクタを直接呼べないように (new できないように)、コンストラクタを private にします。次に、 唯一作成されるインスタンスを保持する static 変数を定義し、そこにインスタンスをセット。インスタンスを取得する (static) メソッドで、 そのインスタンスを返す。
基本的な考え方はこうしたものです。Java や C++ などでも同様に実装されます。
それでは、クラスの定義方法が大きく JavaScript ではどうしたらよいでしょうか。
JavaScript でのシングルトンの実装
それではさっそく、JavaScript でのシングルトンの実装をみてみましょう。
具体例として、次のような状況を考えます。
ボタンがあり、そのボタンをクリックするとアプリケーション名を表示します。
アプリケーションの情報をグローバルに保持するオブジェクトをシングルトンで実装する、ということを考えます。
これは次のように書けます。
var MyApp = function() {
var appName = 'Singleton Test1';
return {
getName: function() {
return appName;
}
}
}();
function button1_click(){
alert( MyApp.getName() );
}
button1_click というファンクションはボタンをクリックしたときのイベントハンドラです。変数 MyApp にシングルトンの実体がセットされています。
このコードはいったいどういう意味でしょうか。
function の中身をみてください。appName という変数があり、それがアプリケーション名を保持しています。
このファンクションはオブジェクトを返しますが、そのオブジェクトは getName という名前の関数を持っています。括弧 {} によるオブジェクトの定義方法については JavaScript の基礎「オブジェクト」をみてください。
getName 関数はアプリケーション名を保持する appName の値を返しています。
appName はファンクションのローカル変数として宣言されていますが、JavaScript の関数がクロージャであるため getName 関数は appName 変数にアクセスし続けられています。 クロージャについては JavaScript の基礎「クロージャ」をみてください。