javascriptモード——Flyweight

8430 ワード

Flyweightはデータメモリを共有するモードである.
 
Flyweightモードはいくつかの共有属性を個人から削除し、共有の対象に置く.
 
以下はプロジェクトの例で、Flyweightモードの利点を表示するために継続的に改良されている.
今はパソコンの生産プログラムを作りたいです.パソコンの普通はメーカー、機種、CPUタイプ、メモリ、モデルがあります.
私たちの最初のコードは以下の通りです.
//    

var Computer = function (make, model, processor, memory, tag) {

    this.make = make;

    this.model = model;

    this.processor = processor;

    this.memory = memory;

    this.tag = tag;

}



//            

var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");

var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P");



console.log(computer1); 

console.log(computer2);
 コードを簡単に分析すると、2台の異なるコンピュータの最初の3つの属性、ブランド、機種とCPUは同じであることが分かります.私たちは毎回、そのために新たに割り当てを定義します.
 
考えてみてください.このように100台以上のコンピューターがあれば、メモリにとって大きな出費です.これらの同じ属性を共有化してもいいですか?
//    

var Computer = function (make, model, processor, memory, tag) {

    

    //           

    if(make + model + processor === "DellStudio XPSIntel"){

        this.flyweight = flyweight1;

    }

    this.memory = memory;

    this.tag = tag;

}



//     

var flyweight = {

    make: 'Dell', 

    model: "Studio XPS", 

    processor: "Intel"

}



//   

var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");

var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P");



console.log(computer1);

console.log(computer2);
ここでは、ほぼ固定された属性を共有してクラスから削除し、硬いオブジェクトflyweightを作って彼らを預けて共有します.このように、新生産は各コンピュータに5つの属性がありますが、その中の上位3つの属性はすべてflyweight対象のデータを共有しています.メモリの節約ができました.特にこのように前の三つの属性が同じコンピュータが多い時、これはもうFlyweightの精髄です.ただ私達のモードはまだ初歩的です.
 
私達の考えを続けて、もし私達はもう一つの共有ユニットが必要なら、オブジェクトを再作成しますか?いいえ、ちがいます.この時、一つのクラスで様々な享元を作成し、一つのオブジェクトをリストとして保存するほうがいいです.
//     

var flyweightList = {};



var Computer = function (make, model, processor, memory, tag) {

    

    if(flyweightList[make+model+processor]){

        

        //

        this.flyweight = flyweightList[make+model+processor];

    }else {

        

        //

        this.flyweight = new Flyweight(make, model, processor);

        flyweightList[make+model+processor] = this.flyweight;

    }

    

    this.memory = memory;

    this.tag = tag;

}



//    

function Flyweight (make, model, processor) {

    

    this.make = make;

    this.model = model;

    this.processor = processor;

    

};





var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");

var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P");



var computer3 = new Computer("HP", "Envy", "Intel", "2G", "801632312");



console.log(computer1);

console.log(computer2);

console.log(computer3);
 
これはいいです.ただ享元リストはグローバル変数としてあまりよくないようです.比較的高級な享元モードで運用するには、他の方法が必要です.さらに私たちはモジュールモードでお楽しみいただけます.
function Flyweight (make, model, processor) {

    

    this.make = make;

    this.model = model;

    this.processor = processor;

    

};



var FlyweightFactory = (function(){

    

    //   

    var flyweightList = {};

    

    return {

        

        //     

        addFlyweight: function (make, model, processor){

            if(!flyweightList[make+model+processor]){

                flyweightList[make+model+processor] = new Flyweight(make, model, processor);

            }

            return flyweightList[make+model+processor];

        },

        

        //   

        count: function(){

            var count = 0;

            for (var f in flyweightList) count++;

            return count;

        }

    }

})()



var Computer = function (make, model, processor, memory, tag) {

    

    this.flyweight = FlyweightFactory.addFlyweight(make, model, processor)

    this.memory = memory;

    this.tag = tag;

    

}



var computer1 = new Computer("Dell", "Studio XPS", "Intel", "4G", "Y755P");

var computer2 = new Computer("Dell", "Studio XPS", "Intel", "8G", "Y755P");

var computer3 = new Computer("HP", "Envy", "Intel", "2G", "801632312");



console.log(computer1);

console.log(computer2);

console.log(computer3);

console.log(FlyweightFactory.count())
 
享元は非常に一般的な設計モデルであり、性能の最適化に大きな役割を果たしている.