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 innerHTML 的一些问题的解决方法
Jun 22 Javascript
JavaScript 直接操作本地文件的实现代码
Dec 01 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
Feb 19 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
Extjs表单常见验证小结
Mar 07 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
Node.js 数据加密传输浅析
Nov 16 Javascript
详解js的事件代理(委托)
Dec 22 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
Feb 19 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
vue组件添加事件@click.native操作
Oct 30 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的库,结果发现很多东西
2006/12/31 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php中stdClass的用法分析
2015/02/27 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
python SVM 线性分类模型的实现
2019/07/19 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
签约仪式主持词
2014/03/19 职场文书
初中新生军训方案
2014/05/13 职场文书
企业法人代表任命书
2014/06/06 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
单位工资证明范本
2015/06/12 职场文书
初中政教处工作总结
2015/08/12 职场文书
请假条应该怎么写?
2019/06/24 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS