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 相关文章推荐
jQuery的slideToggle方法实例
May 07 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
JQuery操作textarea,input,select,checkbox方法
Sep 02 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
Sep 14 Javascript
JS实现动画兼容性的transition和transform实例分析
Dec 13 Javascript
jQuery ajax的功能实现方法详解
Jan 06 Javascript
基于Vue2.0的分页组件
Mar 16 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 Javascript
layui的layedit富文本赋值方法
Sep 18 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
python list排序的两种方法及实例讲解
2017/03/20 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Python查看微信撤回消息代码
2018/06/07 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
python中round函数如何使用
2020/06/19 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
医学专业职业生涯规划范文
2014/02/05 职场文书
庆七一活动总结
2014/08/27 职场文书
挂职学习心得体会
2014/09/09 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
英语教师个人总结
2015/02/09 职场文书
采购员岗位职责范本
2015/04/07 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL