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正则表达式来格式化XML内容
Jul 04 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
javascript实现的一个带下拉框功能的文本框
May 08 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
Apr 02 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
Vue2实现组件props双向绑定
Dec 02 Javascript
详解webpack 多入口配置
Jun 16 Javascript
node.js中http模块和url模块的简单介绍
Oct 06 Javascript
浅谈webpack编译vue项目生成的代码探索
Dec 11 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
原生js实现随机点餐效果
Dec 10 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 文件上传类代码
2011/08/06 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
Python 初始化多维数组代码
2008/09/06 Python
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
遗传算法之Python实现代码
2017/10/10 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python支付宝支付示例详解
2019/08/22 Python
python实现银行管理系统
2019/10/25 Python
python标准库OS模块详解
2020/03/10 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
一年级小学生评语
2014/04/22 职场文书
企业安全生产承诺书
2014/05/22 职场文书
三严三实对照检查材料
2014/08/25 职场文书
法人委托书的范本格式
2014/09/11 职场文书
务工证明怎么写
2015/06/18 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书