JavaScript设计模式之享元模式实例详解


Posted in Javascript onJanuary 17, 2019

本文实例讲述了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设计模式之享元模式实例详解

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript背投广告代码的完善
Apr 08 Javascript
js 数组的for循环到底应该怎么写?
May 31 Javascript
基于jquery跨浏览器显示的file上传控件
Oct 24 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
JS 获取select(多选下拉)中所选值的示例代码
Aug 02 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
树结构之JavaScript
Jan 24 Javascript
vue 优化CDN加速的方法示例
Sep 19 Javascript
javascript刷新父页面方法汇总详解
Oct 10 Javascript
针对Vue路由history模式下Nginx后台配置操作
Oct 22 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
二维码条形码生成的JavaScript脚本库
Jul 07 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 #Javascript
jquery获取img的src值实例介绍
Jan 16 #jQuery
js中int和string数据类型互相转化实例
Jan 16 #Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 #Javascript
JavaScript设计模式之命令模式实例分析
Jan 16 #Javascript
js删除数组中某几项的方法总结
Jan 16 #Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 #Javascript
You might like
Yii核心组件AssetManager原理分析
2014/12/02 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
java解析json方法总结
2019/05/16 PHP
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Python流程控制 while循环实现解析
2019/09/02 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
幼儿园大班开学教师寄语
2014/04/03 职场文书
开工仪式策划方案
2014/05/23 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
企业工会工作总结2015
2015/05/13 职场文书
生日宴会祝酒词
2015/08/10 职场文书
python多次执行绘制条形图
2022/04/20 Python