JavaScript利用享元模式优化文件上传性能

作者:寒星时间:2026-10-22 16:35:22浏览:494

本文介绍如何利用JavaScript中的享元模式优化文件上传功能。针对大量文件上传导致浏览器假死的问题,通过复用对象实例减少内存占用,确保在上传数千个文件时保持系统稳定,避免创建过多冗余对象。

本文通过具体示例展示如何在JavaScript中应用享元模式来优化文件上传操作,供读者参考学习。

享元模式原理

享元模式是一种旨在提升性能的设计模式。当系统中因创建大量相似对象而导致内存占用过高时,采用该模式可以有效降低资源消耗。

具体应用场景如下:

文件上传场景分析

在浏览器环境中进行文件上传时,若采用常规编程方式,每上传一个文件就会实例化一个对象。例如,若需上传2000个文件,系统将生成2000个独立对象,极易导致浏览器响应停滞或假死。此时,引入享元模式是合理的解决方案。

代码实现

具体实现代码如下:


var Upload = function( uploadType ){
  this.uploadType = uploadType;
};
Upload.prototype.delFile = function( id ){
  uploadManager.setExternalState( id, this );
  if( this.fileSize < 300 ){
   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(createFlyWeightObjs[uploadType]){
        return createdFlyWeightObjs[uploadType];
      }
      return createdFlyWeightObjs[uploadType] = new Upload(uploadType);
    }
  }
})();
var uploadManager = (function(){
  var uploadDatabase = {};
  return{
    add: function(id, uploadType, fileName, fileSize){
      var flyWeightObj = UploadFactory.create( uploadType );
      var dom = document.createElement( 'div' );
      dom.innerHTML = '<span>文件名称:'+fileName+',文件大小:' +fileSize + '</span>' + '<button class="delFile">删除</button>';
      dom.querySelector( ".delFile" ).onclick = function(){
       flyWeightObj.delFile( id );
       document.body.appendChild( dom );
       uploadDatabase[ id ] = {
         fileName: fileName,
         fileSize: fileSize,
         dom: dom
       };
       return flyWeightObj;
     },
     setExternalState: functon( id, flyWeightObj ){
        var uploadData = uploadDatabase[ id ];
        for( var i in uploadData){
           flyWeightObj[ i ] = uploadData[ i ];
        }
     }
  }
})();

接下来需要定义一个触发上传动作的startUpload函数:


var id = o;
window.startUpload = function( uploadType, files ){
  for( var i=0,file; file = fules[ i ++ ];){
     var uploadObj = uploadManger.add( ++id, uploadType, file.fileName, file.fileSize );
  }
};

最终调用方式如下所示:


startUpload( 'plugin', [
  {
    fileName: '1.txt',
    fileSize: 1000
   },
   {
     fileName: '2.html',
     fileSize: 1000
   },
   {
     fileName: '3.txt',
     fileSize: 5000
   }
]);
startUpload( 'flash', [
  {
    fileName: '4.txt',
    fileSize: 1000
   },
   {
     fileName: '5.html',
     fileSize: 1000
   },
   {
     fileName: '6.txt',
     fileSize: 5000
   }
]);

原理解析

原理解析:

在上述示例中,尽管涉及六个对象,但仅包含两种类型(plugin和flash)。通过享元模式,系统仅创建这两个类型的实例。若按前述逻辑上传2000个文件,利用该代码结构同样仅维持这两个对象实例,从而有效避免了浏览器崩溃或假死的问题。

如需了解更多JavaScript相关知识,可查阅本站相关专题,包括《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。

希望本文所述内容能对您的JavaScript程序设计工作提供帮助。

作者最新文章