JavaScript:単例の書き方

1650 ワード

単一の例のモードはオブジェクト指向プログラミングの範式においても非常に有用である.例を挙げると、サービス化の思想を先端に導入し、いくつかの共通論理をサービスのモードで提供することができる.サービスを一例にして、概念の理解とコードの維持に大きな便宜をもたらすことができます.
でも、JavaScriptはES 6でも、単例についての優雅な書き方がないので、これはSwiftよりずっと悪いです.インターネットで紹介された文章がありますが、どうやって書けばいいですか?ES 6で「JavaScript Patterns」のデザインを書き換える
即時実行で実現する
ES 6で「JavaScript Patterns」のデザインを書き換える
let __instance = (function () {
    let instance;
    return (newInstance) => {
        if (newInstance) instance = newInstance;
        return instance;
    }
}());

class Singleton {
    constructor() {
        if (__instance()) return __instance();
        //        
        this.foo = 'bar';
        __instance(this);
    }
}

let s1 = new Singleton();
let s2 = new Singleton();

console.log(s1.foo); //'bar'
console.log(s1 === s2); //true
利点:一般クラスと同じnewキーワードでオブジェクトを作成しますが、あくまでもオブジェクトが一つしかなく、事実上のシングルパターンです.短所:グローバル関数__instanceおよび関数内部変数instanceは、クラス外で遊離しています.
静関数で実現
S 6のクラスを使って優雅に単例モードを書きますか?
class Singleton {
  static getInstance() {
    if (! Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

let s1 = Singleton.getInstance();
let s2 = Singleton.getInstance();
console.log(s1 === s2); //true
利点:オブジェクトの一例を静的変数に保存します.オブジェクトを取得する方法は静的関数です.短所:new方式で作成したオブジェクトは一例ではなく、使用者が一例でないモードを使用することを阻止できない.
どちらにしますか
両方ともいいです.どちらを選んでもいいです.
  • の第1の方法はnewの一例の伝統的な方式を維持し、普通の例のように感じられるが、実際には単一の例である.たまに変な感じがします.
  • の第二の方法は、この一例を静的関数で取得するという意味が明確になり、使用者は、現在は一例であることを知っている.new操作というのは、一般的な使い方です.お互いの隔離の一般例です.単一の例であるか、それとも普通の例であるかは、使用者によって決定される.