javascript设计模式 ? 享元模式原理与用法实例分析


Posted in Javascript onApril 15, 2020

本文实例讲述了javascript设计模式 ? 享元模式原理与用法。分享给大家供大家参考,具体如下:

介绍:在我们日常开发中需要创建很多对象,虽然垃圾回收机制能帮我们进行回收,但是在一些需要重复创建对象的场景下,就需要有一种机制来进行优化,提高系统资源的利用率。

享元模式就是解决这类问题,主要目的是减少创建对象的数量。享元模式提倡重用现有同类对象,如未找到匹配的对象则创建新对象

定义:运用共享技术有效的支持大量细粒度对象的复用。系统只适用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度的对象,因此他又称为轻量级模式,是一种对象结构型模式。

场景:我们以创建圆形对象为例,通过两个例子来对比享元模式的效果。

示例:

var redCricle = new Circle('red');
redCricle.setAttr(10,10,10);
redCricle.draw();
 
var redCricle1 = new Circle('red');
redCricle1.setAttr(1,1,100);
redCricle1.draw();
 
var redCricle2 = new Circle('red');
redCricle2.setAttr(5,5,50);
redCricle2.draw();
 
var blueCricle = new Circle('blue');
blueCricle.setAttr(1,1,50);
blueCricle.draw();
 
var blueCricle1 = new Circle('blue');
blueCricle1.setAttr(12,12,50);
blueCricle1.draw();
 
var blueCricle2 = new Circle('blue');
blueCricle2.setAttr(2,12,20);
blueCricle2.draw();
// 创建了一个对象
// 画圆: 颜色:red x:10 y:10 radius:10
// 创建了一个对象
// 画圆: 颜色:red x:1 y:1 radius:100
// 创建了一个对象
// 画圆: 颜色:red x:5 y:5 radius:50
// 创建了一个对象
// 画圆: 颜色:blue x:1 y:1 radius:50
// 创建了一个对象
// 画圆: 颜色:blue x:12 y:12 radius:50
// 创建了一个对象
// 画圆: 颜色:blue x:2 y:12 radius:20

这种情况下每次使用都需要实例化一次Circle对象,对系统资源来说是一种浪费。

观察下不难发现,除了第一次需要实例化,其余的可以基于实例继续修改。

我们修改下:

var Circle = function(color){
  console.log('创建了一个对象');
  this.color = color;
  this.x;
  this.y;
  this.radius;
 
  this.setAttr = function(x, y, radius){
    this.x = x;
    this.y = y;
    this.radius = radius;
  }
  this.draw = function(){
    console.log('画圆: 颜色:' + this.color + ' x:' + this.x + ' y:' + this.y + ' radius:' + this.radius)
  }
}
 
var ShapeFactory = function(){
  this.circleMap = {};
  this.getCircle = function(color){
    var circle = this.circleMap[color];
    if(!circle){
      circle = new Circle(color);
      this.circleMap[color] = circle;
    }
    return circle;
  }
}
var factory = new ShapeFactory();
 
var redCricle = factory.getCircle('red');
redCricle.setAttr(10,10,10);
redCricle.draw();
 
var redCricle1 = factory.getCircle('red');
redCricle1.setAttr(1,1,100);
redCricle1.draw();
 
var redCricle2 = factory.getCircle('red');
redCricle2.setAttr(5,5,50);
redCricle2.draw();
 
var blueCricle = factory.getCircle('blue'); 
blueCricle.setAttr(1,1,50);
blueCricle.draw();
 
var blueCricle1 = factory.getCircle('blue');
blueCricle1.setAttr(12,12,50);
blueCricle1.draw();
 
var blueCricle2 = factory.getCircle('blue');
blueCricle2.setAttr(2,12,20);
blueCricle2.draw();
 
// 创建了一个对象
// 画圆: 颜色:red x:10 y:10 radius:10
// 画圆: 颜色:red x:1 y:1 radius:100
// 画圆: 颜色:red x:5 y:5 radius:50
// 创建了一个对象
// 画圆: 颜色:blue x:1 y:1 radius:50
// 画圆: 颜色:blue x:12 y:12 radius:50
// 画圆: 颜色:blue x:2 y:12 radius:20

我们通过一个工厂来动态创建Circle对象,将实例进行保存,保存的位置称之为享元池。第二次创建时,直接使用已有的结果。节约了系统资源

享元模式总结:

优点:
* 大大减少对象的创建,降低系统内存使用,使效率提高。
* 享元模式外部状态独立,不会影响其内部状态,使得享元对象可以在不同环境被共享。

缺点:
* 提高了系统复杂度,且需要相同的属性,否则会造成系统混乱

适用场景:
* 一个系统有大量相同或相似的对象,造成内存大量耗费。
* 对象大部分状态都可以外部化
* 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源。因此使用时要衡量。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 定义初始化数组函数
Sep 07 Javascript
jquery ajax abort()的使用方法
Oct 28 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
javascript的 {} 语句块详解
Feb 27 Javascript
使用jQuery制作基础的Web图片轮播效果
Apr 22 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
vue+axios实现文件下载及vue中使用axios的实例
Sep 21 Javascript
JS前端轻量fabric.js系列之画布初始化
Aug 05 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 #Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 #Javascript
vue-cli设置publicPath小记
Apr 14 #Javascript
vue 实现用户登录方式的切换功能
Apr 14 #Javascript
react 不用插件实现数字滚动的效果示例
Apr 14 #Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 #Javascript
编写一个javascript元循环求值器的方法
Apr 14 #Javascript
You might like
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
Python lambda和Python def区别分析
2014/11/30 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
Django REST framework 分页的实现代码
2019/06/19 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
50道外企软件测试面试题
2014/08/18 面试题
红领巾心向党广播稿
2014/01/19 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
正规欠条模板
2015/07/03 职场文书
保外就医申请书范文
2015/08/06 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android