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 相关文章推荐
jQuery 跨域访问问题解决方法
Dec 02 Javascript
js过滤数组重复元素的方法
Sep 05 Javascript
JavaScript实现图片滑动切换的代码示例分享
Mar 06 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
Nov 22 Javascript
jQuery is not defined 错误原因与解决方法小结
Mar 19 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
vue中的模态对话框组件实现过程
May 01 Javascript
微信小程序实现拼图小游戏
Oct 22 Javascript
如何用JS实现网页瀑布流布局
Apr 24 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
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
PHP实现单例模式最安全的做法
2014/06/13 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python表达式的优先级详解
2020/02/18 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
公司培训欢迎词
2014/01/10 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
大学生暑期实践感言
2014/02/26 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
学习十八大标语
2014/10/09 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2015年保送生自荐信
2015/03/24 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python