javascript设计模式 – 享元模式原理与用法实例分析
作者:李小强 发布时间:2024-10-17 02:39:42
本文实例讲述了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对象,将实例进行保存,保存的位置称之为享元池。第二次创建时,直接使用已有的结果。节约了系统资源
享元模式总结:
优点:
* 大大减少对象的创建,降低系统内存使用,使效率提高。
* 享元模式外部状态独立,不会影响其内部状态,使得享元对象可以在不同环境被共享。
缺点:
* 提高了系统复杂度,且需要相同的属性,否则会造成系统混乱
适用场景:
* 一个系统有大量相同或相似的对象,造成内存大量耗费。
* 对象大部分状态都可以外部化
* 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源。因此使用时要衡量。
希望本文所述对大家JavaScript程序设计有所帮助。
来源:http://www.isjs.cn/?p=981


猜你喜欢
- 1、not关键词可以反转一个布尔值。>>> not TrueFalse>>>>>> n
- 任务1、记录用户登录日志import timedef show_info():? ? print('输入提示数字,执行相应操作:0退
- 中间件是我们在软件开发中的一个古老而强大的概念,当我们在应用程序中使用路由相关模式时,它非常有用。如果您不太了解中间件的含义,Nodejs框
- 因为一些原因,卸载了Anaconda2的版本,转向3..发现Jupyter挂了.百思不得其解.后来了解到是因为内核找不到的问题导致的.这里整
- 先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用it
- 本文实例为大家分享了Python将一个Excel拆分为多个Excel的具体代码,供大家参考,具体内容如下原始文档如下图所示将销售部门一、二、
- 1. 引言今天来给小伙伴推荐两款实用的便于调试Python代码的工具,可以方便展示我们调试代码的中间状态,提升大家的编码效率。2. 动机在日
- 一、字符集 character字符 character 是各种文字和符号的总称字符编码 character code 是计算机针对各种符号,
- base64 其实是一种编码转换方式, 将 ASCII 字符转换成普通文本, 是网络上最常见的用于传输8Bit字节代码的编码方式之一。bas
- 话不多说,直接上代码吧!import numpy as npA = np.delete(A, 1, 0) # 删除A的第二行B = np.d
- 本教程配置好后一劳永逸,不用再配置,每次只需要选择 Python 解释器即可打开KBEngine的服务器项目文件夹(资产目录)其主要工程目录
- 阅读上一篇:交互设计模式(二)-Pagination(分页,标记页数) Tagging(标签)问题摘要用户往往想通过流行或最详尽的主题来浏览
- bootstrap-fileinput源码:https://github.com/kartik-v/bootstrap-fileinputb
- 一、语法错误异常:大多数的异常都不会被程序处理,都以错误信息的形式展现在这里二、异常处理while True: t
- Prometheus是什么Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数据库的
- tkinter库:Python的标准Tk GUI工具包的接口示例:from tkinter import *root = Tk()#你的ui
- 强化功能本文针对中大型的后台项目的接口模块优化,在不影响项目正常运行的前提下,增量更新。接口文件写法简化(接口模块半自动化生成)任务调度、L
- 若数据库是sql server,我以前为了返回插入记录的id,一般是用下面的存储过程:程序代码 create procedure&
- 导语:用 Python 读取图片的像素值,然后输出到 Excel 表格中,最终形成一幅像素画,也就是电子版的十字绣了。基本思路实现这个需求的
- 前言遥感影像分类图一般为特定数值对应一类地物,用Python绘制时,主要在颜色的映射和对应的图例生成。plt.matplotlib.colo