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中删除元素的实现代码
Dec 29 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
jquery中添加属性和删除属性
Jun 03 Javascript
初步了解javascript面向对象
Nov 09 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
Jun 17 Javascript
JS实现字符串转驼峰格式的方法
Dec 16 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
Mar 03 Javascript
js实现返回顶部效果
Mar 10 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
Jul 28 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php用header函数实现301跳转代码实例
2013/11/25 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
python实现简单ftp客户端的方法
2015/06/28 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
python做反被爬保护的方法
2019/07/01 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
西式婚礼证婚词
2014/01/12 职场文书
网络编辑求职信
2014/04/30 职场文书
素质教育标语
2014/06/27 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2014年村委会工作总结
2014/11/24 职场文书
给病人的慰问信
2015/03/23 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
施工安全员岗位职责
2015/04/11 职场文书
心理健康教育主题班会
2015/08/13 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
感谢信的技巧及范例
2019/05/15 职场文书