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 相关文章推荐
js DOM模型操作
Dec 28 Javascript
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
html dom节点操作(获取/修改/添加或删除)
Jan 23 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
Angular实现svg和png图片下载实现
May 05 Javascript
vue+django实现下载文件的示例
Mar 24 Vue.js
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开发中四种查询返回结果分析
2011/01/02 PHP
php 文章调用类代码
2011/08/11 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript 函数参数限制说明
2010/11/19 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
py2exe 编译ico图标的代码
2013/03/08 Python
python GUI实例学习
2017/11/21 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
教师个人的自我评价分享
2014/01/02 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
北体毕业生求职信
2014/02/28 职场文书
颁奖晚会主持词
2014/03/25 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
2014年科协工作总结
2014/12/09 职场文书
病房管理制度范本
2015/08/06 职场文书
导游词之潮音寺
2019/09/26 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
mysql联合索引的使用规则
2021/06/23 MySQL
vue的项目如何打包上线
2022/04/13 Vue.js