Singleton Pattern

昨日ご紹介した新たなクラス定義の手法を適用して、id:reinyannyan:20051015:1129356763 の Singleton Pattern の実装をアップデートしてみましょう。今回も prototype.js を利用した形です。

シングルトン・クラス作成メソッド:

Class.singleton = function (proto)
{
    var klass =
    {
	instance: function ()
	{
	    if (!this.__instance__)
	    {
		var klass = Class.create();
		klass.prototype = proto;
		this.__instance__ = eval('new klass');
		proto = null;
	    }
	    return this.__instance__;
	}
    };
    return klass;
};

中身はいわゆるクロージャになっています。引数 proto、即ちクラス定義 (への参照) が、定義後もプログラム中で保持され続けるということを利用しているわけです。

この参照は、一度インスタンスを作成すればもう用は無いので手放してやります (そうしないとガーベジ・コレクトされません。よね?)。

サンプル:

var SingletonClass = Class.singleton(
{
    initialize: function ()
    {
	// 普通に定義
    },
    ...
});

var a = SingletonClass.instance();
var b = SingletonClass.instance();
alert(a == b);	// -> true

インスタンスを呼ぶメソッド名は Ruby に倣って instance としてみました。

比較的単純な実装ですが、シングルトン化の部分を隠蔽することができたため、定義が簡易に行えるようになりました。