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语句中的CDATA标签的意义
May 09 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
Vue-cli配置打包文件本地使用的教程图解
Aug 02 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
小程序实现上下移动切换位置
Sep 23 Javascript
layui-select动态选中值的例子
Sep 23 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
Oct 02 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 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不用正则采集速度探究总结
2008/03/24 PHP
PHP类的反射用法实例
2014/11/03 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
PHP实现微信提现功能
2018/09/30 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
从0开始的Python学习016异常
2019/04/08 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
Python自动登录QQ的实现示例
2020/08/28 Python
美国精油公司:Plant Therapy
2019/05/17 全球购物
大学专科生推荐信范文
2013/11/23 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
助残日活动总结
2014/08/27 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
学习经验交流会总结
2015/11/02 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js