JavaScript享元模式原理与用法实例详解


Posted in Javascript onMarch 09, 2020

本文实例讲述了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享元模式原理与用法实例详解

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

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

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

Javascript 相关文章推荐
Prototype使用指南之selector.js
Jan 10 Javascript
js 文件引入实现代码
Apr 23 Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
A标签中通过href和onclick传递的this对象实现思路
Apr 19 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
初识Node.js
Mar 20 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
JavaScript Array对象详解
Mar 01 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
May 03 Javascript
JavaScript装饰者模式原理与用法实例详解
Mar 09 #Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 #Javascript
JavaScript中的this基本问题实例小结
Mar 09 #Javascript
Nuxt页面级缓存的实现
Mar 09 #Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 #Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 #Javascript
前端深入理解Typescript泛型概念
Mar 09 #Javascript
You might like
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
php把session写入数据库示例
2014/02/26 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
高考考python编程是真的吗
2020/07/20 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
J2EE模式面试题
2016/10/11 面试题
环境科学专业个人求职信
2013/12/15 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
单位领导证婚词
2014/01/14 职场文书
早会主持词
2014/03/17 职场文书
继承公证书
2014/04/09 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
初三语文教学计划
2015/01/22 职场文书
外国人来华邀请函
2015/01/31 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL