享元模式实际上是一种优化模式,目的在于提高系统的性能和代码的效率。

使用享元模式的条件:最重要的条件是网页中必须使用了大量资源密集型对象,如果只会用到了少许这类对象,那么这种优化并不划算。第二个条件是这些对象中所保存的数据至少有一部分能被转换为外在的数据。最后一个条件是,将外在的数据分离出去以后,独一无二的对象的数目相对减少。

使用享元模式的步骤: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设计模式-享元模式的更多相关文章

  1. 浅谈js设计模式 — 享元模式

    享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 假设有个内衣工厂,目前的产品有 50种男式内 ...

  2. 8. 星际争霸之php设计模式--享元模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. C++设计模式——享元模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...

  4. java设计模式——享元模式

    一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1)  常常应用于系统底层的开发,以便解决系统的性能 ...

  5. 【设计模式】Java设计模式 - 享元模式

    Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  6. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构

  7. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  8. javascript 设计模式-----享元模式

    四个轮子,一个方向盘,有刹车,油门,车窗,这些词首先让人联想到的就是一辆汽车.的确,这些都是是一辆车的最基本特征,或者是属性,我们把词语抽象出来,而听到这些词语的人把他们想象陈一辆汽车.在代码里面也是 ...

  9. 深入浅出设计模式——享元模式(Flyweight Pattern)

    模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...

随机推荐

  1. 01--Java IO基础

    一.java.io包概览 Java IO包主要可以分为如下4类: 基于字节操作的I/O接口:InputStream和OutputStream. 基于字符操作的I/O接口:Writer和Reader 基 ...

  2. 省市区县的sql语句——省

    /*SQLyog v10.2 MySQL - 5.5.48 : Database - 省市县****************************************************** ...

  3. java如何设置文件的权限

    import java.io.File; 2.import java.io.IOException; 3./× 4.×只能给当前用户赋予对该文件的权限,调用createNewFile()方法默认的权限 ...

  4. java 练习

    class Hello{ public static void main(String [] args) { System.out.println(" Hello 这是我的第一个java作品 ...

  5. win8使用教程

    win8如何关机 http://product.pconline.com.cn/itbk/software/win8/1305/3301394.html shutdown.exe -s -t 00 W ...

  6. 基于 react-navigation 父子组件的跳转链接

    1.在一个页面中中引入一个组件,但是这个组件是一个小组件,例如是一个cell,单独的每个cell都是需要点击有链接跳转的,这个时候通常直接使用 onPress 的跳转就会不起作用 正确的处理方法是,在 ...

  7. 【第一课】kaggle初识

    Evernote Export Crowdflower搜索结果相关性 文件和数据描述 train.csv训练数据集包括: id:产品ID查询:使用的搜索词 product_description:完整 ...

  8. eas之获取各模块系统状态信息

    public void getSystemStatue() throws EASBizException, BOSException    {        CompanyOrgUnitInfo co ...

  9. (ccf模拟)201709-2公共钥匙盒

    #include <iostream> #include<string> #include <algorithm> #include<sstream> ...

  10. tp5 权限设置

    ============================== <?php/** * Created by PhpStorm. * User: 14155 * Date: 2018/11/10 * ...