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插件Tabs实现过程
Jul 06 Javascript
js里怎么取select标签里的值并修改
Dec 10 Javascript
用JavaScript修改CSS属性的代码
May 06 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
jQuery EasyUI之DataGrid使用实例详解
Jan 04 Javascript
js密码强度实时检测代码
Mar 02 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 Javascript
AngularJS页面传参的5种方式
Apr 01 Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 Javascript
JavaScript实现移动端轮播效果
Jun 06 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初学者(入门学习经验谈)
2010/10/12 PHP
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python得到单词模式的示例
2018/10/15 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
python中加背景音乐如何操作
2020/07/19 Python
学生就业推荐信
2013/11/13 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
协议书怎么写
2014/04/21 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
内勤岗位职责范本
2015/04/13 职场文书
生死抉择观后感
2015/06/09 职场文书
红高粱观后感
2015/06/10 职场文书
投诉书范文
2015/07/02 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫