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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
js setTimeout 常见问题小结
Aug 13 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
微信小程序 转发功能的实现
Aug 04 Javascript
js Element Traversal规范中的元素遍历方法
Apr 19 Javascript
详解使用create-react-app添加css modules、sasss和antd
Jul 31 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 Javascript
如何换个角度使用VUE过滤器详解
Sep 11 Javascript
解决elementui表格操作列自适应列宽
Dec 28 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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
Python实现微信表情包炸群功能
2021/01/28 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
农村党支部先进事迹
2014/01/14 职场文书
运动会100米解说词
2014/01/23 职场文书
班组安全员工作职责
2014/02/01 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
《静夜思》教学反思
2016/02/17 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python