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 动态生成方法的例子
Jul 22 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
javascript加载xml 并解析各节点的值(实现方法)
Oct 12 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 Javascript
vue实现路由懒加载的3种方法示例
Sep 01 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 Javascript
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
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开发框架myqee新手快速入门教程
2014/07/14 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
python脚本设置系统时间的两种方法
2016/02/21 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
如何在pycharm中安装第三方包
2020/10/27 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
人事任命书怎么写
2014/06/05 职场文书
社区综治工作汇报
2014/10/27 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
vue ref如何获取子组件属性值
2022/03/31 Vue.js