メインコンテンツへ移動

シングルトンパターン_JavaScript デザインパターン 3

無料2015-07-14#JS#Design_Pattern#JavaScript设计模式#JavaScript单例模式#Singleton_Pattern

Singleton(シングルトン)パターンは JS での実装が非常に簡単で、依存注入を考慮しない場合、オブジェクトリテラル方式で作成されたオブジェクトはシングルトンです。本稿では JS 中のシングルトンパターンを詳しく紹介します

一.シングルトンパターンの役割

単件パターンは经常被用来管理资源敏感的对象,比如:数据库连接对象、注册表对象、线程池对象等等,这种对象如果同时存在多个的话就会造成各种不一致的麻烦(你总不希望发生数据库重复连接的异常吧)

黯羽轻扬:设计模式之单件模式(Singleton Pattern) より引用

さらに、シングルトンパターンはメモリオーバーヘッドを削減するためにも使用できます(巨大なオブジェクトが 1 つのみであることを保証)

二.最もシンプルなシングルトンパターン

var singleton = {
    // attr: val
}

はい、これだけです。singleton が指すオブジェクトは唯一であり、他の方法でこのようなオブジェクトを作成することはできません(ディープコピーは除く。コピーの前提はすでにそのようなオブジェクトが存在しているためです)。コンストラクタ方式で実装されたシングルトンと比較して、オブジェクトリテラルには自然な利点があります——それは「一回限り」のものです

このシングルトンには強い依存(密結合)の欠点があり、依存関係はオブジェクトリテラル中に制限されており、初期化時にパラメータを渡すことさえできません(シングルトン自体は機能が完全なオブジェクト(モジュール)であり、初期化時にパラメータを渡せない場合、必ずその機能に影響します)

三.一般的なシングルトンパターン

モジュールパターンと組み合わせて上記の問題を修復できます。例えば:

var singleton = (function() {
    var obj;    // 単例の引用

    function init() {
        // 私有属性
        // var attr = val
        
        return {
            // 公有属性
            // attr: val
        }
    }

    return {
        getInstance: function() {
            if (!obj) {
                obj = init();
            }

            return obj;
        }
    }
})();

// 使用
var mySingleton = singleton.getInstance();
// mySingleton.xxx

singleton.getInstance() がグローバルアクセスエントリーポイントであり、このエントリーポイントから取得するオブジェクトはすべて同じです。遅延初期化が不要な場合、getInstance インターフェースを提供する必要はなく、直接シングルトンオブジェクトを返せばよいです。もちろん、大多数の場合、シングルトンパターンは巨大なオブジェクトを意味し、遅延初期化は非常に必要です

四.JavaScript 中シングルトンパターンの役割

ブラウザ環境中の JS はシングルスレッドであり、臨界資源を管理する必要がなく、資源敏感な大オブジェクト(データベース接続オブジェクト、登録表オブジェクト、スレッドプールオブジェクトなど)も存在しません。このように見ると、JS 中のシングルトンパターンは役に立たないように思えます。

事実确实是这样です。JS 中のシングルトンパターンの唯一の用途はおそらく巨大なオブジェクトを管理することで、同時に複数の巨大なオブジェクトが存在することによるメモリ消費を回避します。例えば jQuery のようなトップレベルネームスペース、および各レベルの子ネームスペースで、シングルトンパターンで管理することで混乱を回避できます

参考資料

コメント

コメントはまだありません

コメントを書く