javascriptモード——Flyweight
8430 ワード
Flyweightはデータメモリを共有するモードである.
Flyweightモードはいくつかの共有属性を個人から削除し、共有の対象に置く.
以下はプロジェクトの例で、Flyweightモードの利点を表示するために継続的に改良されている.
今はパソコンの生産プログラムを作りたいです.パソコンの普通はメーカー、機種、CPUタイプ、メモリ、モデルがあります.
私たちの最初のコードは以下の通りです.
考えてみてください.このように100台以上のコンピューターがあれば、メモリにとって大きな出費です.これらの同じ属性を共有化してもいいですか?
私達の考えを続けて、もし私達はもう一つの共有ユニットが必要なら、オブジェクトを再作成しますか?いいえ、ちがいます.この時、一つのクラスで様々な享元を作成し、一つのオブジェクトをリストとして保存するほうがいいです.
これはいいです.ただ享元リストはグローバル変数としてあまりよくないようです.比較的高級な享元モードで運用するには、他の方法が必要です.さらに私たちはモジュールモードでお楽しみいただけます.
享元は非常に一般的な設計モデルであり、性能の最適化に大きな役割を果たしている.
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())
享元は非常に一般的な設計モデルであり、性能の最適化に大きな役割を果たしている.