JavaScript设计模式之享元模式实例详解


Posted in Javascript onJanuary 17, 2019

本文实例讲述了JavaScript设计模式之享元模式。分享给大家供大家参考,具体如下:

通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的设计模式,享元模式可以避免大量非常相似类的开销。

第一实例,没有使用享元模式,计算所花费的时间和空间使用程度。

要求为:有一个城市要进行汽车的登记

(1)汽车类

/**
* 制造商
* 型号
* 拥有者
* 车牌号码
* 最近一次登记日期
*/
var Car = function(make,model,year,owner,tag,renewDate){
    this.make = make;
    this.model = model;
    this.year = year;
    this.owner = owner;
    this.tag = tag;
    this.renewDate = renewDate;
    this.getMake = function(){
      return this.make;
    }
}

(2)使用装饰者模式--计算函数的耗时

//装饰者 .. 计算函数的耗时
var simpleProfiler = function(componet){
    this.componet = componet;
    this.action = function(methodName){
      var self = this;
      var method = componet[methodName];
      //如果是函数那就进行装饰
      if(typeof method == "function"){
        var startDate = new Date().getTime();//开始时间
        method.apply(self.componet,arguments);
        var endDate = new Date();//结束时间
        alert(endDate - startDate);
      }
    }
}

(3)具体的实例,现有4150000辆车需要登记

var ca = new Array();
function addCar(){
    this.begin = function(){
      for (var i = 0; i < 4150000; i++) {
        ca.push(new Car("BMW","宝马","2017-10-18",
          "","GBMW88","2017-10-19"));
      }
    }
}
new simpleProfiler(new addCar()).action("begin")

第二个例子:使用享元模式

(1)汽车类

/**
* 制造商
* 型号
* 拥有者
* 车牌号码
* 最近一次登记日期
*/
var Car = function(make,model,year){
    this.make = make;
    this.model = model;
    this.year = year;
    this.getMake = function(){
      return this.make;
    }
}

(2)单例模式的简单工厂

//单例模式的简单工厂
  var myCarInfo = function(){
    this.createCar = function(make,model,year,owner,tag,renewDate){
      var c = carInfoFactory(make,model,year);
      c["owner"] = owner;
      c["tag"] = tag;
      c["renewDate"] = renewDate;
      return c;
    }
  }
  var carInfoFactory = (function(){
    var carInfo = {};
    return function(make,model,year){
      if(carInfo[make+model+year]){
        return carInfo[make+model+year];
      }else{
        var newCar = new Car(make,model,year);
        carInfo[make+model+year] = newCar;
        return newCar;
        a
      }
    }
  })();

(3)现有4150000辆车需要登记

var test = new myCarInfo();
var startDate = new Date().getTime();
var ca = new Array();
for (var i = 0; i < 4150000; i++) {
    ca.push(test.createCar("BMW","宝马","2017-10-18",
          "","GBMW88","2017-10-19"))
}
var endDate = new Date();
alert(endDate - startDate);

从上述两个例子可以知道,第一个例子没有使用享元模式相对于第二个使用享元模式耗时间少,但空间消耗大,第二个耗时多,但空间消耗小。

第一种情况图解:每次都生成相同的实例

JavaScript设计模式之享元模式实例详解

第二种情况:内在部分(不变)+外部状态(变化)图解

JavaScript设计模式之享元模式实例详解

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
IE之动态添加DOM节点触发window.resize事件
Jul 27 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
video.js使用改变ui过程
Mar 05 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
vue输入框使用模糊搜索功能的实现代码
May 26 Javascript
如何利用JS将手机号中间四位变成*号
Sep 29 Javascript
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 #Javascript
jquery获取img的src值实例介绍
Jan 16 #jQuery
js中int和string数据类型互相转化实例
Jan 16 #Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 #Javascript
JavaScript设计模式之命令模式实例分析
Jan 16 #Javascript
js删除数组中某几项的方法总结
Jan 16 #Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 #Javascript
You might like
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
PDO::setAttribute讲解
2019/01/29 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
解决python3 json数据包含中文的读写问题
2018/05/10 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Python实现快速排序的方法详解
2019/10/25 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
公司请假条范文
2014/04/11 职场文书
关于安全的演讲稿
2014/05/09 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
董事长致辞
2015/07/29 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书