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 圆角div的实现代码
Oct 15 Javascript
Extjs在exlipse中设置自动提示的方法
Apr 07 Javascript
javascript面向对象之Javascript 继承
May 04 Javascript
js动态设置鼠标事件示例代码
Oct 30 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
jQuery实现炫酷的鼠标轨迹特效
Feb 01 Javascript
手机端转盘抽奖代码分享
Sep 10 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
Apr 29 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
Mar 21 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 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四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP微信支付开发实例
2016/06/22 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
JavaScript触发器详解
2007/03/10 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
js实现文字截断功能
2016/09/14 Javascript
从0开始学Vue
2016/10/27 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
Python中Random和Math模块学习笔记
2015/05/18 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
为什么说python适合写爬虫
2020/06/11 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
森林防火工作方案
2014/02/14 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
体育教师求职信
2014/06/30 职场文书
绿色小区申报材料
2014/08/22 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
2014年售票员工作总结
2014/11/19 职场文书
给男朋友的道歉短信
2015/05/12 职场文书