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 事件属性绑定带参数的函数
Mar 13 Javascript
js遍历子节点子元素附属性及方法
Aug 19 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
JQuery实现左右滚动菜单特效
Sep 28 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
15个非常实用的JavaScript代码片段
Dec 18 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
js 函数式编程学习笔记
Mar 25 Javascript
基于Datatables跳转到指定页的简单实例
Nov 09 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
JavaScript事件的委托(代理)的用法示例详解
Feb 18 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
php中目录,文件操作详谈
2007/03/19 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
php实现将Session写入数据库
2015/07/26 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
python构建自定义回调函数详解
2017/06/20 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
python实现交并比IOU教程
2020/04/16 Python
共产党员公开承诺书
2014/03/25 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
综合办公室岗位职责
2015/04/11 职场文书
病危通知单
2015/04/17 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Nginx反向代理、重定向
2022/04/13 Servers