js設計モード——単例モード

4220 ワード

単一モード
クラスにインスタンスが1つしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.
単一の例のモードは一般的なモードで、スレッドプール、グローバルキャッシュ、ブラウザのwindowオブジェクトなど、いくつかのオブジェクトが1つしか必要ありません.
JavaScriptでの単一モード
1.ネーミングスペースの使用
JavaScriptでは、単一の例を実装する方法はいくつかあります.その中で最も簡単な方法は、オブジェクトの字面量を使用する方法で、その字面量には多くの属性と方法が含まれています.
let people = {
  name: "Jack",
  age: 18,
  play() {
    console.log('i like game');
  }
}

ネーミングスペースを動的に作成することもできます
//     
var MyApp = {};
//      
MyApp.namespace = function( name ){
  //         
  var parts = name.split( '.' );
  //     
  var current = MyApp;
  //          
  for ( var i in parts ){
    if ( !current[ parts[ i ] ] ){
      current[ parts[ i ] ] = {};
    }
    current = current[ parts[ i ] ];
  }
};
MyApp.namespace( 'event' );
MyApp.namespace( 'dom.style' );

/*******************          ***********************/
//        
var MyApp = {
  event: {},
  dom: {
    style: {}
  } 
};

2.パッケージングを使用したプライベート変数のパッケージング
var user = (function(){ 
  var __name = 'sven', 
  __age = 29; 
  return { 
    getUserInfo: function(){ 
      return __name + '-' + __age; 
    } 
  } 
})();

下線を用いてプライベート変数__name__ageを約束し,それらは閉パケットによって生成された役割ドメインにカプセル化され,外部はこの2つの変数にアクセスできず,これによりグローバルな命令汚染を回避した.
標準的な単一モードを実現
var Singleton = function( name ){
  this.name = name;
  this.instance = null;
};
Singleton.prototype.getName = function(){
  alert ( this.name );
};
Singleton.getInstance = function( name ){
  if ( !this.instance ){
    this.instance = new Singleton( name );
  }
  return this.instance;
};
var a = Singleton.getInstance( 'sven1' );
var b = Singleton.getInstance( 'sven2' );
alert ( a === b ); // true
Singleton.getInstanceによってSingletonクラスの唯一のオブジェクトを取得する方法は比較的簡単であるが,このクラスの「不透明性」が増すという問題があり,Singletonクラスの使用者はこれが単例クラスであることを知らなければならず,従来のnew XXXによるオブジェクトの取得とは異なり,ここではSingleton.getInstanceを用いてオブジェクトを取得する.
透明な単一モード
var CreateDiv = (function(){
  var instance;
  var CreateDiv = function( html ){
    if ( instance ){
      return instance;
    }
    this.html = html;
    this.init();
    return instance = this;
  };
  CreateDiv.prototype.init = function(){
    var div = document.createElement( 'div' );
    div.innerHTML = this.html;
    document.body.appendChild( div );
  };
  return CreateDiv;
})();
var a = new CreateDiv( 'sven1' );
var b = new CreateDiv( 'sven2' );
alert ( a === b ); // true
instanceをカプセル化するために,自己実行匿名関数と閉パッケージを用い,この匿名関数を真のSingleton構造法に戻し,いくつかのプログラムの複雑さを増大させた.
3.エージェントによる一例モデルの実現
var CreateDiv = function( html ){
  this.html = html;
  this.init();
};
CreateDiv.prototype.init = function(){
  var div = document.createElement( 'div' );
  div.innerHTML = this.html;
  document.body.appendChild( div );
};
//     proxySingletonCreateDiv:
var ProxySingletonCreateDiv = (function(){
  var instance;
  return function( html ){
    if ( !instance ){
      instance = new CreateDiv( html );
    }
    return instance;
  }
})();
var a = new ProxySingletonCreateDiv( 'sven1' );
var b = new ProxySingletonCreateDiv( 'sven2' );
alert ( a === b );

エージェントクラスを導入することによって、私たちは同様に1つの単例モードの作成を完了しました.以前とは異なり、今、管理単例を担当する論理をエージェントクラスproxySingletonCreateDivに移しました.これにより、CreateDivは一般的なクラスとなり、proxySingletonCreateDivと組み合わせて単例モードの効果を達成することができる.
不活性単例
不活性な単一の例は、必要に応じてオブジェクトインスタンスを作成することを意味します.
var Singleton = (function () {
  var instantiated;
  function init() {
    /*        */
    return {
      publicMethod: function () {
      console.log('hello world');
    },
    publicProperty: 'test'
  };
}

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

/*            :*/
Singleton.getInstance().publicMethod(); 

以上の方法で,使用時のみ初期化を行い,資源節約の目的を達成することができる.
今のところ単例パターンに対する理解はこれだけで、これからも新しい理解があれば更新し続けて、ずるずるしてしまいます(~ ̄▽ ̄)~