js设计模式-享元模式
享元模式实际上是一种优化模式,目的在于提高系统的性能和代码的效率。
使用享元模式的条件:最重要的条件是网页中必须使用了大量资源密集型对象,如果只会用到了少许这类对象,那么这种优化并不划算。第二个条件是这些对象中所保存的数据至少有一部分能被转换为外在的数据。最后一个条件是,将外在的数据分离出去以后,独一无二的对象的数目相对减少。
使用享元模式的步骤:1、将所有外在的数据从目标类剥离。2、创建一个用来控制该类的实例化工厂。3、创建一个用来保存外在数据的管理器。
实例:工具提示对象。(Tooltip)
先看一个没有用到享元模式的例子。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>工具提示对象</title>
<style type="text/css">
.test-div{
width:100px; heiht:30px;text-align:center; line-height: 30px; cursor: pointer;border:1px solid #101010; margin-top:20px;
}
.tooltip{
height:20px; line-height: 20px; border: 1px solid #ccc; border-radius: 2px; font-family: monospace; font-size: 12px;
background: #ddd; padding:2px 5px;
}
</style>
</head>
<body>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
</body>
</html>
<script type="text/javascript"> window.onload = function(){
var aDiv = document.getElementsByTagName("div");
for(var i = 0 , len = aDiv.length;i<len;i++){
new Tooltip(aDiv[i],"this is a div, the index is:" + i);
}
} var Tooltip = function(targetElement,text){
this.target = targetElement;
this.text = text; this.delayTimeout = null; // show tooltip timer
this.delay = 500; // 延时时长 //create the html this.element = document.createElement("div");
this.element.style.display = "none";
this.element.style.position = "absolute";
this.element.className = "tooltip";
document.getElementsByTagName("body")[0].appendChild(this.element);
this.element.innerHTML = this.text; //attach the events var that = this;
this.target.addEventListener("mouseover",function(e){
that.startDelay(e);
}); this.target.addEventListener("mouseout",function(){
that.hide();
})
}; Tooltip.prototype = {
startDelay:function(e){
if(this.delayTimeout == null){
var that = this;
var x = e.clientX;
var y = e.clientY;
this.delayTimeout = setTimeout(function(){
that.show(x,y);
},this.delay);
}
},
show:function(x,y){
clearTimeout(this.delayTimeout);
this.element.style.left = x + "px";
this.element.style.top = y + "px";
this.element.style.display = "block";
},
hide:function(){
clearTimeout(this.delayTimeout);
this.delayTimeout = null;
this.element.style.display = "none";
}
} </script>
结果:把鼠标放到每个div上以后,用debug查看element元素,会发现生成很多tooltip的div。

使用享元模式以后:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>工具提示对象</title>
<style type="text/css">
.test-div{
width:100px; heiht:30px;text-align:center; line-height: 30px; cursor: pointer;border:1px solid #101010; margin-top:20px;
}
.tooltip{
height:20px; line-height: 20px; border: 1px solid #ccc; border-radius: 2px; font-family: monospace; font-size: 12px;
background: #ddd; padding:2px 5px;
}
</style>
</head>
<body>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
<div class="test-div">test div</div>
</body>
</html>
<script type="text/javascript" src="ToolTip.js"></script>
<script type="text/javascript">
window.onload = function(){
var aDiv = document.getElementsByTagName("div");
for(var i = 0 , len = aDiv.length;i<len;i++){
TooltipManager.addTooltip(aDiv[i],"this is a div, the index is:" + i);
}
}
</script>
对应的js:
var TooltipManager = (function(){
var storedInstance = null;
/*Tooltip class*/
var Tooltip = function(){
this.delayTimeout = null; // show tooltip timer
this.delay = 500; // 延时时长
//create the html
this.element = document.createElement("div");
this.element.style.display = "none";
this.element.style.position = "absolute";
this.element.className = "tooltip";
document.getElementsByTagName("body")[0].appendChild(this.element);
};
Tooltip.prototype = {
startDelay:function(e,text){
if(this.delayTimeout == null){
var that = this;
var x = e.clientX;
var y = e.clientY;
this.delayTimeout = setTimeout(function(){
that.show(x,y,text);
},this.delay);
}
},
show:function(x,y,text){
clearTimeout(this.delayTimeout);
this.element.style.left = x + "px";
this.element.style.top = y + "px";
this.element.style.display = "block";
this.element.innerHTML = text;
},
hide:function(){
clearTimeout(this.delayTimeout);
this.delayTimeout = null;
this.element.style.display = "none";
}
};
return {
addTooltip:function(targetElement,text){
var tt = this.getToolTip();
targetElement.addEventListener("mouseover",function(e){tt.startDelay(e,text)});
targetElement.addEventListener("mouseout",function(e){tt.hide()});
},
getToolTip:function(){
if(null == storedInstance){
storedInstance = new Tooltip();
}
return storedInstance;
}
}
})();
结果:

结论:享元模式好处不言而喻。
js设计模式-享元模式的更多相关文章
- 浅谈js设计模式 — 享元模式
享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 假设有个内衣工厂,目前的产品有 50种男式内 ...
- 8. 星际争霸之php设计模式--享元模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——享元模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...
- java设计模式——享元模式
一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1) 常常应用于系统底层的开发,以便解决系统的性能 ...
- 【设计模式】Java设计模式 - 享元模式
Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构
- [工作中的设计模式]享元模式模式FlyWeight
一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...
- javascript 设计模式-----享元模式
四个轮子,一个方向盘,有刹车,油门,车窗,这些词首先让人联想到的就是一辆汽车.的确,这些都是是一辆车的最基本特征,或者是属性,我们把词语抽象出来,而听到这些词语的人把他们想象陈一辆汽车.在代码里面也是 ...
- 深入浅出设计模式——享元模式(Flyweight Pattern)
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
随机推荐
- 安卓通过UDP协议传输数据,中文乱码的问题
公司最近需要往智能家居方面发展,需要用到UDP协议传输数据,在网上找到了一些资料,但是发现传输中文的时候有乱码的现象,经过我多番捣鼓,终于解决了这个问题,下面贴上关键代码 客户端: public cl ...
- linux 清空文件的几种方案
之前要清理文件,都是简单粗暴的rm -rf log文件,最近,发现在某些环境下,是不能删除文件本省的,又必须要清理文件的内容信息,经过亲自实验,目测以下的几种方案是可行的,方案如下: 1.采用vi命令 ...
- C# 彻底关闭程序,包括循环
System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();
- CNN结构:用于检测的CNN结构进化-一站式方法
有兴趣查看原文:YOLO详解 人眼能够快速的检测和识别视野内的物体,基于Maar的视觉理论,视觉先识别出局部显著性的区块比如边缘和角点,然后综合这些信息完成整体描述,人眼逆向工程最相像的是DPM模型. ...
- SpringBoot入门系列(转)
SpringBoot入门系列:第一篇 Hello World http://blog.csdn.net/lxhjh/article/details/51711148
- sql server 查询数据判断为空
and xxx is NOT null and xxx is null
- 浏览器内置的base64方法
Base64是一种基于64个可打印字符来表示二进制数据的表示方法.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(维基百科: ...
- Firebug全了解
Firebug是firefox下的一个扩展,能够调试所有网站语言,如Html,Css等,但FireBug最吸引人的就是javascript调试功能,使用起来非常方便,而且在各种浏览器下都能使用(IE, ...
- codevs 2602 最短路径问题——良心题解
2602 最短路径问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在- ...
- WPF通过鼠标滑轮缩放显示图片
如果你使用WinForm比较难实现通过滚动鼠标滑轮来对图片进行缩放显示,那么,你应该考虑一下使用WPF,既然是下一代Windows客户端开发平台,明显是有一定优势的,不然,MS是吃饱了撑着. 首先 ...