JavaScript設計モード10(享元モード)

4230 ワード

定義#テイギ#
享元モードは性能最適化のためのモードであり、享元モードの核心は共有技術を用いて大量の細粒度を効果的にサポートする対象である.
システムに類似のオブジェクトが多数作成されてメモリが高すぎる場合は、メタモードが便利です.

初期エンティティモード


下着工場があります(...なぜこの例なのか)、現在の製品は50種類の男性と50種類の女性があります.製品を販売するためには、モデルが広告を撮る必要があります.通常は50人の男性モデルと50人の女性モデルが必要です.そして、彼ら一人一人に写真を撮らせます.享元モードは適用されません.コードは以下の通りです.
var Model = function(sex, underwear) {
    this.sex = sex;
    this.underwear = underwear
}

Model.prototype.takePhoto = function(){
    console.log('sex: ' + this.sex + 'underwear: ' + this.underwear);
}

for (var i = 0; i < 50; i++) {
    var maleModel = new Model('male', 'underwear' + i);
    maleMode.takePhoto();
}

for (var j = 0; j < 50; i++) {
    var femaleModel = new Model('male', 'underwear' + j);
    femaleMode.takePhoto();
}

これは問題ないように見えますが、下着が10000枚になったり、さらに多くなったりすると、new 10000の対象ではありません.実は私たちは最適化して、私たちは1人の男性モデルと1人の女性モデルだけでいいでしょう.
var Model = function(sex) {
    this.sex = sex;
}

Model.prototype.takePhoto = function(){
    console.log('sex: ' + this.sex + 'underwear: ' + this.underwear);
}

var maleModel = new Model('male');
var femaleModel = new Model('female');

for ( var i = 1; i <= 50; i++ ){ 
    maleModel.underwear = 'underwear' + i; 
    maleModel.takePhoto(); 
};

for ( var j = 1; j <= 50; j++ ){ 
    femaleModel.underwear = 'underwear' + j; 
    femaleModel.takePhoto(); 
};

楽しかったかな、ははは

内部ステータスと外部ステータス


実はこの例は享元モデルの原型で、享元モデルはオブジェクトの属性を内部状態と外部状態に分けることを要求して、目標はできるだけ共有オブジェクトの数を減らして、どのように内部状態と外部状態を区別します:
  • の内部状態は、オブジェクト内部
  • に記憶する.
  • の内部状態は、いくつかのオブジェクトによって共有することができる
  • .
  • 内部の状態は特定のシーンとは独立しており、通常は
  • は変更されない.
  • 外部状態は、特定のシーンに依存する、シーンに応じて変化し、外部状態を共有することはできない
  • .
    上の例では性別は内部状態,下着は外部状態である.メタモードを使用する鍵は、内部状態と外部状態を区別することです.

    メタモードの汎用構造


    上の下着の例には2つの問題があります
  • newによって2つのオブジェクトを明示的に作成しましたが、他のシステムでは最初からnewを必要とする
  • ではない可能性があります.
  • modelにunderwear外部状態を手動で設定しましたが、複雑なシステムでは、外部の状態が複雑である可能性があるため、共有オブジェクトとのつながりが困難になる可能性があります.
    1つ目は、オブジェクトが本当に必要な場合にのみ、ファクトリから作成されるオブジェクトファクトリを使用して解決できます.2つ目は、フックと共有オブジェクトを結合するように、オブジェクトに関連する外部状態を記録するマネージャを使用します.つまりfactoryとManagerが必要です.実装方法は書籍「JavaScript設計モードと実践」を参考にすることができます.