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 Select操作大集合
May 26 Javascript
js实现文字在按钮上滚动的方法
Aug 20 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
老生常谈javascript的面向对象思想
Aug 22 Javascript
你或许不知道的一些npm实用技巧
Jul 04 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 Javascript
axios实现文件上传并获取进度
Mar 25 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
Oct 30 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php实现httpclient类示例
2014/04/08 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
简单学习vue指令directive
2016/11/03 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python实现购物车购物小程序
2018/04/18 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python 实现try重新执行
2019/12/21 Python
python logging模块的使用
2020/09/07 Python
在线服装零售商:SheIn
2016/07/22 全球购物
美国校园市场:OCM
2017/06/08 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
几道PHP的面试题
2012/05/19 面试题
社会学专业学生职业规划书
2014/02/07 职场文书
色戒观后感
2015/06/12 职场文书
成事在人观后感
2015/06/16 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python
Golang 链表的学习和使用
2022/04/19 Golang
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技
Hive HQL支持2种查询语句风格
2022/06/25 数据库