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 相关文章推荐
JSON 学习之完全手册 图文
May 29 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
js渐变显示渐变消失示例代码
Aug 01 Javascript
利用Jquery实现可多选的下拉框
Feb 21 Javascript
jQuery数据缓存用法分析
Feb 20 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 Javascript
Javascript的无new构建实例详解
May 15 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
AngularJS实现按钮提示与点击变色效果
Sep 07 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
在vue中使用echars实现上浮与下钻效果
Nov 08 Javascript
微信小程序实现二维码签到考勤系统
Jan 16 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
Python性能优化技巧
2015/03/09 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
python如何使用代码运行助手
2020/07/03 Python
python如何实现word批量转HTML
2020/09/30 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
《乌塔》教学反思
2014/02/17 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
医德医风演讲稿
2014/05/20 职场文书
大型演出策划方案
2014/05/28 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
会计稽核岗位职责
2015/04/13 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
监守自盗观后感
2015/06/10 职场文书
学子宴致辞大全
2015/07/27 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android