2016-09-23 18 views
-2

私は初心者ですので、私と一緒に、私はシングルトンパターンを見て、それを実装する方法を理解するのは非常に難しいです、と私はいくつかの人々がほとんどの時間を避けることを提案するだろう知っているので、私はそれが理解しやすいと思うバリエーションしかし、何とか私はこれがこのパターンの最高の実装ではないと感じます、あなたはこのパターンのより良い形を提案することができます。このシングルトンパターンには何か問題がありますか?

var Foo = (function() { 
 
    
 
    var instance; 
 
    var _priVar = 2; 
 
    var log = function() { 
 
     console.log("Hello"); 
 
    }; 
 
    
 
    function Singleton(x, y) { 
 
     if (instance) { 
 
      return instance; 
 
     } 
 
     
 
     this.name = x; 
 
     this.age = y + _priVar; 
 
     this.log = log; 
 
     
 
     instance = this; 
 
    } 
 
    Singleton.getInstance = function() { 
 
     return instance || new Singleton(); 
 
    } 
 
    return Singleton; 
 
}());
私の目標は、私たちが

var a = new Foo("Bob", 24); var b = new Foo(); var c = Foo(); var d = Foo.getInstance();

を次の手順を実行したときに、我々はまだ取得することである

a == b // true 
a == c // true 
a == d // true 
a.name // 'Bob' 
b.age // 26 
c.log // 'Hello' 
d.name // 'Bob' 

もモジュールパターンとして知られている最も簡単なシングルトンは、オブジェクトリテラルで構成さのおかげで、

+0

あなたが望むところでは、コードはうまく機能します。 – passion

+0

「私たちはまだ手に入れます」 - あなたはそれを得ます - 何が問題なのですか? –

+0

ほとんどの場合、[シングルトンパターン自体に問題があります](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons)、あなたの特定の実装はこれらの問題を継承します。 – Bergi

答えて

1

var foo = (function() { 
    var x = "Bob", 
     y = 24, 
     _priVar = 2; 

    function log() { 
     console.log("Hello"); 
    } 

    return { 
     name: x, 
     age: y + _priVar, 
     log: log 
    }; 
}()); 

あなたが怠惰な初期化を紹介したい場合は、あなたがあなたのように余分なgetInstance機能を使用することができます実装:

var getFoo = (function() { 
    var instance = null; 
    return function getFooInstance() { 
     if (instance) return instance; 

     var x = "Bob", 
      y = 24, 
      _priVar = 2; 

     function log() { 
      console.log("Hello"); 
     } 

     return instance = { 
      name: x, 
      age: y + _priVar, 
      log: log 
     }; 
    }; 
}()); 

シングルトンは、コード内のようなコンストラクタを使用しないでください。これは単なる不要です。あなたが初期化の引数を渡す必要があると感じたら、はそれをシングルトンにしないでください

+0

最終行のアドバイスをいただきありがとうございます。シングルトンでコンストラクタを使用しない理由を説明できますか? 「不必要」以外の理由は他にありますか? – xcode

+0

空で無駄なプロトタイプを作成します。それは、 'new'、dunnoなしでうっかり呼び出されるかもしれません。それは過度に複雑です。シンプルなファクトリ関数を実行します。 – Bergi

関連する問題