php 享元模式,javascript享元模式的定义和如何应用代码实例详解

享元(flyweight)模式是一种用于性能优化的模式,核心是运用共享技术来有效支持大量细刻度的对象。在JavaScript中,浏览器特别是移动端的浏览器分配的内存并不算多,如何节省内存就成了一个非常有意义的事情。享元模式是一种用时间换空间的优化模式

什么场景下使用享元模式?

(1)程序中使用大量的相似对象,造成很大的内存开销

(2)对象的大多数状态都可以变为外部状态,剥离外部状态之后,可以用相对较少的共享对象取代大量对象

如何应用享元模式?

第一种是应用在数据层上,主要是应用在内存里大量相似的对象上;

第二种是应用在DOM层上,享元可以用在中央事件管理器上用来避免给父容器里的每个子元素都附加事件句柄。

享元模式要求将对象的属性分为内部状态和外部状态。

内部状态独立于具体的场景,通常不会改变,可以被一些对象共享;

外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享。

享元模式中常出现工厂模式,Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象。

缺点:对象数量少的情况,可能会增大系统的开销,实现的复杂度较大!

示例:文件上传

var Upload = function(uploadType) {

this.uploadType = uploadType;

}

/* 删除文件(内部状态) */

Upload.prototype.delFile = function(id) {

uploadManger.setExternalState(id, this); // 把当前id对应的外部状态都组装到共享对象中

// 大于3000k提示

if(this.fileSize < 3000) {

return this.dom.parentNode.removeChild(this.dom);

}

if(window.confirm("确定要删除文件吗?" + this.fileName)) {

return this.dom.parentNode.removeChild(this.dom);

}

}

/** 工厂对象实例化

* 如果某种内部状态的共享对象已经被创建过,那么直接返回这个对象

* 否则,创建一个新的对象

*/

var UploadFactory = (function() {

var createdFlyWeightObjs = {};

return {

create: function(uploadType) {

if(createdFlyWeightObjs[uploadType]) {

return createdFlyWeightObjs[uploadType];

}

return createdFlyWeightObjs[uploadType] = new Upload(uploadType);

}

};

})();

/* 管理器封装外部状态 */

var uploadManger = (function() {

var uploadDatabase = {};

return {

add: function(id, uploadType, fileName, fileSize) {

var flyWeightObj = UploadFactory.create(uploadType);

var dom = document.createElement('p');

dom.innerHTML = "文件名称:" + fileName + ",文件大小:" + fileSize +""

+ "删除";

dom.querySelector(".delFile").onclick = function() {

flyWeightObj.delFile(id);

};

document.body.appendChild(dom);

uploadDatabase[id] = {

fileName: fileName,

fileSize: fileSize,

dom: dom

};

return flyWeightObj;

},

setExternalState: function(id, flyWeightObj) {

var uploadData = uploadDatabase[id];

for(var i in uploadData) {

// 直接改变形参(新思路!!)

flyWeightObj[i] = uploadData[i];

}

}

};

})();

/*触发上传动作*/

var id = 0;

window.startUpload = function(uploadType, files) {

for(var i=0,file; file = files[i++];) {

var uploadObj = uploadManger.add(++id, uploadType, file.fileName, file.fileSize);

}

};

/* 测试 */

startUpload("plugin", [

{

fileName: '1.txt',

fileSize: 1000

},{

fileName: '2.txt',

fileSize: 3000

},{

fileName: '3.txt',

fileSize: 5000

}

]);

startUpload("flash", [

{

fileName: '4.txt',

fileSize: 1000

},{

fileName: '5.txt',

fileSize: 3000

},{

fileName: '6.txt',

fileSize: 5000

}

]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值