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 相关文章推荐
jquery中对于批量deferred的处理方法
Jan 22 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
JavaScript实现标题栏文字轮播效果代码
Oct 24 Javascript
开启BootStrap学习之旅
May 04 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
Oct 09 Javascript
Bootstrap Table使用心得总结
Nov 29 Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 Javascript
vue中接口域名配置为全局变量的实现方法
Sep 20 Javascript
前端Vue项目详解--初始化及导航栏
Jun 24 Javascript
使用ThinkJs搭建微信中控服务的实现方法
Aug 08 Javascript
国内常用的js类库大全(CDN公共库)
Jun 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
解析左右值无限分类的实现算法
2013/06/20 PHP
php强制运行广告的方法
2014/12/01 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
解放web程序员的输入验证
2006/10/06 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
js new Date()实例测试
2019/10/31 Javascript
python 将字符串转换成字典dict
2013/03/24 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python中的decorator的作用详解
2018/07/26 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python地图绘制实操详解
2019/03/04 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
Born鞋子官网:Born Shoes
2017/04/06 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
自主实习接收函
2014/01/13 职场文书
工作失职检讨书范文
2014/01/16 职场文书
幼儿发展评估方案
2014/06/11 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
质量主管工作职责
2014/09/26 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
欠条范文
2015/07/03 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers