博客
关于我
Javascript设计模式-15-享元模式
阅读量:631 次
发布时间:2019-03-14

本文共 2627 字,大约阅读时间需要 8 分钟。

Javascript设计模式 - 15 - 享元模式

说明

享元模式是一种用于性能优化的模式,它的核心是运用共享技术来有效支持大量细粒度的对象

下边例子借用了 《javascript 设计模式与开发实践》

内部状态和外部状态

享元模式要求将对象的属性划分为内部状态与外部状态(状态指的是属性),享元模式的目标是减少共享对象的数量

状态划分

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

状态划分目的

我们可以把所有内部状态指定到一个共享对象上,而外部状态剥离出去,存储在外部,也就是说剥离了外部状态的对象成为共享对象,外部状态在必要的时候被传入共享对象组装成一个完整的对象,虽然组装外部状态的过程需要花费一定的时间,但却可以减少系统中对象的数量, 因此享元模式是一种用时间换空间的优化模式

使用场景

  • 一个程序中使用了大量的相似对象
  • 由于使用了大量的对象,造成了很大的内存开销
  • 对象的大多数状态都可以变为外部状态
  • 剥离出对象的外部状态之后,可以使用相对较少的共享对象取代大量对象
// 创建模特类    var Model = function (sex) {           // 内部状态        this.sex = sex;    }    // 快照    Model.prototype.takePhoto = function () {           console.log('sex = ' + this.sex + ' underwear = ' + this.underwear);    }    // 创建男模特和女模特,一共只创建两个    var maleModel = new Model('male');    var femaleModel = new Model('female');    // 穿衣服拍照,装配 underwear 外部状态    for (var i = 0; i < 50; i++) {        maleModel.underwear = 'underwear' + i;        maleModel.takePhoto();    }    for (var i = 0; i < 50; i++) {        femaleModel.underwear = 'underwear' + i;        femaleModel.takePhoto();    }

对象池

对象池维护一个装载空闲对象的池子,如果需要对象时,不直接创建,而是转从对象池里获取,如果对象池里没有空闲对象,则创建一个新对象,当获取的对象完成了他的职责后,再进入池子等待被下次获取,这也是一种共享技术

// 定义气泡创建工厂    var toolTipFactory = (function () {           // 创建对象池        var toolTipPool = [];        return {            // 创建            create: function () {                   if (toolTipPool.length === 0) {                    // 对象池为空,创建                    var div = document.createElement('div');                    document.body.appendChild(div);                    return div;                } else {                    // 对象池不为空,直接返回对象池中对象                    return toolTipPool.shift();                }            },            // 移入对象池            recover: function (toolTipDom) {                   return toolTipPool.push(toolTipDom);            },            getToolTipPool: function () {                   return toolTipPool;            }        }    }())    // 首次创建    var ary = [];    var strs = [ 'A', 'B' ];    for ( var i = 0; i < strs.length; i++){         var toolTip = toolTipFactory.create();         toolTip.innerHTML = strs[i];         ary.push( toolTip );     }    // 会受到对象池    for (var i = 0; i < ary.length; i++) {        toolTipFactory.recover(ary[i]);    }    console.log(toolTipFactory.getToolTipPool()); //  [div, div]    // 再次创建    var strs2 = [ 'A', 'B', 'C', 'D', 'E', 'F' ];    for ( var i = 0; i < strs2.length; i++){         var toolTip = toolTipFactory.create();         toolTip.innerHTML = strs2[i];         ary.push( toolTip );     }    console.log(toolTipFactory.getToolTipPool()); // []

文章列表

转载地址:http://bfvoz.baihongyu.com/

你可能感兴趣的文章
Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx在开发中常用的基础命令
查看>>
Nginx基础知识点与使用场景梳理
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx如何实现图片防盗链
查看>>
Nginx学习总结(10)——Nginx前后端分离将多个请求转发到多个Tomcat,负载均衡反向代理
查看>>
Nginx学习总结(11)——提高Nginx服务器的安全性,稳定性和性能的12种技巧
查看>>
Nginx学习总结(12)——Nginx各项配置总结
查看>>
Nginx学习总结(13)——Nginx 重要知识点回顾
查看>>
Nginx学习总结(14)——Nginx配置参数详细说明与整理
查看>>
Nginx学习总结(15)—— 提升 Web 应用性能的十个步骤
查看>>
Nginx学习总结(1)——Nginx入门简介
查看>>
Nginx学习总结(2)——Nginx手机版和PC电脑版网站配置
查看>>
Nginx学习总结(3)——Nginx配置及应用场景之高级配置
查看>>
Nginx学习总结(4)——负载均衡session会话保持方法
查看>>
Nginx学习总结(5)——Nginx基本配置备忘
查看>>
Nginx学习总结(6)——Nginx + https + 免费SSL证书配置指南
查看>>
Nginx学习总结(7)——Nginx配置HTTPS 服务器
查看>>
Nginx学习总结(8)——Nginx服务器详解
查看>>