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 相关文章推荐
picChange 图片切换特效的函数代码
May 06 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
jquery选择器的选择使用及性能介绍
Jan 16 Javascript
自己编写的类似JS的trim方法
Oct 09 Javascript
JQuery实现展开关闭层的方法
Feb 17 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
Bootstrap3 Grid system原理及应用详解
Sep 30 Javascript
深入浅出webpack之externals的使用
Dec 04 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
Aug 13 Javascript
Vue实现简单的留言板
Oct 23 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读取csv文件内容的详解
2013/06/18 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
对Python实现累加函数的方法详解
2019/01/23 Python
python opencv摄像头的简单应用
2019/06/06 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
python os.fork() 循环输出方法
2019/08/08 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
python绘制汉诺塔
2021/03/01 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
经贸韩语专业大学生职业规划
2014/02/14 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015年电教工作总结
2015/05/26 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL
Python时间操作之pytz模块使用详解
2022/06/14 Python