美文网首页
JavaScript享元模式

JavaScript享元模式

作者: 晓蟲QwQ | 来源:发表于2021-01-02 11:44 被阅读0次

享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。
享元模式是使用同一个对象处理大量同种业务的模式,其能够避免创建大量相似对象,减少内存使用。

享元模式将对象分为内部状态和外部状态。当两者组合成一个完整对象时使用。

  • 内部状态存储于对象内部。
  • 内部状态可以被一些对象共享。
  • 内部状态独立于具体的场景,通常不会改变。
  • 外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享。

使用享元模式对列表进行业务处理

//元对象
var Upload = function( uploadType ){
    this.uploadType = uploadType;  //内部状态
};

Upload.prototype.delFile = function( id ){
    uploadManager.setExternalState( id, this );  //将uploadManager管理的外部状态绑定于元对象
    
    if( this.fileSize < 3000 ){
        //根据uploadType进行业务处理
        //....
        
        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 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: 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 = uploadManager.add( ++id,uploadType, file.fileName, file.fileSize );
    }
};

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

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

对象池技术与享元模式类似,但对象池没有主动分离内部状态和外部状态。以下为对象池代码:

var objectPoolFactory = function( createObjFn ){
    var objectPool = [];
    
    return {
        create: function(){
            var obj = objectPool.length === 0?
                createObjFn.apply( this,arguments ) : objectPool.shift();
            return obj;
        },
        recover: function( obj ){
            objectPool.push( obj );
        }
    }
};

//对象池的使用
var iframeFactory = objectPoolFactory( function(){
    var iframe = document.createElement('iframe');
        document.body.appendChild( iframe );
    
    iframe.onload = function(){
        iframe.onload = null;  //防止iframe重复加载的bug
        iframeFactory.recover( iframe );  //iframe加载完成之后回收节点
    }
    
    return iframe;
    
});

var iframe1 = iframeFactory.create();
iframe1.src = 'http://baidu.com';

var iframe2 = iframeFactory.create();
iframe2.src = 'http://QQ.com';

setTimeout(function(){
    var iframe3 = iframeFactory.create();
    iframe3.src = 'http://163.com';
},3000 );

相关文章

  • JavaScript享元模式

    享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级。享元模式的核心是...

  • 设计模式之享元模式(flyweight模式)

    引入享元模式 享元模式的实例 享元模式的分析 引入享元模式 flyweight是轻量级的意思,指的是拳击比赛中选手...

  • 第4章 结构型模式-享元模式

    一、享元模式的简介 二、享元模式的优缺点 三、享元模式的实例

  • 享元模式

    一、享元模式介绍 二、享元模式代码实例

  • 设计模式--享元模式

    目录 本文的结构如下: 引言 什么是享元模式 模式的结构 典型代码 代码示例 单纯享元模式和复合享元模式 模式扩展...

  • 享元模式C++

    享元模式,就是运用共享技术有效地支持大量细粒度的对象。 享元模式结构图 享元模式基本代码 应用场景 享元模式可以避...

  • 设计模式之——享元模式

    1 享元模式的定义 享元模式:使用共享对象可有效地支持大量细粒度的对象。享元模式是池技术的重要实现方式。享元模式的...

  • 好程序员Java培训​分享java设计模式之享元模式

    好程序员Java培训​分享java设计模式之享元模式,Java设计模式中的享元模式。享元模式有点类似于单例...

  • 结构型模式:享元模式

    文章首发:结构型模式:享元模式 七大结构型模式之六:享元模式。 简介 姓名 :享元模式 英文名 :Flyweigh...

  • JavaScript设计模式十(享元模式)

    定义 享元模式是一种用于性能优化的模式,享元模式的核心是运用共享技术有效支持大量细粒度的对象。 如果系统中创建了大...

网友评论

      本文标题:JavaScript享元模式

      本文链接:https://www.haomeiwen.com/subject/moqsoktx.html