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 相关文章推荐
TFDN图片播放器 不错自动播放
Oct 03 Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 Javascript
javascript生成随机数的方法
May 16 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
Feb 20 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
安装vue-cli报错 -4058 的解决方法
Oct 19 Javascript
angular4实现tab栏切换的方法示例
Oct 21 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
详解基于electron制作一个node压缩图片的桌面应用
Jan 29 Javascript
Node.js原生api搭建web服务器的方法步骤
Feb 15 Javascript
微信小程序保持session会话的方法
Mar 20 Javascript
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 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
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
jQuery的三种$()
2009/12/30 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
js实现复制粘贴的两种方法
2020/12/04 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
python实现K最近邻算法
2018/01/29 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python3中eval函数用法使用简介
2019/08/02 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
python随机数分布random均匀分布实例
2019/11/27 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
初级Java程序员面试题
2016/03/03 面试题
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
贷款担保书
2015/01/20 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
数据库之SQL技巧整理案例
2021/07/07 SQL Server
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server