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 相关文章推荐
javascript AutoScroller 函数类
May 29 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
js通过八个点 拖动改变div大小的实现方法
Mar 05 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
深入理解setTimeout函数和setInterval函数
May 20 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
基于layui实现高级搜索(筛选)功能
Jul 26 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 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 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
实例讲解python函数式编程
2014/06/09 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python获取交互式ssh shell的方法
2019/02/14 Python
python多线程同步实例教程
2019/08/11 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Python如何读取文件中图片格式
2020/01/13 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
实验教师岗位职责
2014/02/13 职场文书
环保倡议书100字
2014/05/15 职场文书
加班费申请报告
2015/05/15 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS