JavaScript 设计模式 享元模式

发布于 2024-09-05 22:38:06 字数 2916 浏览 36 评论 0

享元模式是一种优化模式。它最适合解决因创建大量类似对象而累及性能的问题。这种模式在 JavaScript 中尤其有用,因为复杂的 JavaScript 代码可能很快就会用光浏览器的所有可用内存。通过把大量独立对象转化为少量共享对象,可降低运行 web 应用程序所需的资源数量

享元模式:优化的设计模式,包括两方面:1. 时间上(代码的运行时间) ,2. 空间上(web 浏览器内存)

简单示例

// 出厂商、型号、出厂日期、拥有者、车牌号、最近登记日期
const 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;
};
Car.prototype = {
  constructor:Car  , 
  getMake :function(){
    return this.make;
  },
  getModel:function(){
    return this.model;
  },
  getYear:function(){
    return this.year;
  },
  renewRegistration:function(newRenewDate){
    this.renewDate = newRenewDate;
  }
};

var arr = [] ;

var stime = new Date().getTime();
for(var i = 0 ; i < 5000000; i ++){
  // runtime: 734ms  web: 570
  arr.push(new Car('上海大众','迈腾','2012-02-03','bhx','bj0011','2013-04-01'));
}
var etime = new Date().getTime();
alert(etime - stime);

使用享元模式优化内存

/**
 * 享元模式:内在数据 static (出厂商、型号、出厂日期),外在数据(拥有者、车牌号、最近登记日期)
 */

//出厂商、型号、出厂日期、拥有者、车牌号、最近登记日期
var Car = function(make ,model , year){
  this.make = make ; 
  this.model = model ; 
  this.year = year ; 
};
Car.prototype = {
  constructor:Car  , 
  getMake :function(){
    return this.make;
  },
  getModel:function(){
    return this.model;
  },
  getYear:function(){
    return this.year;
  }
};

//工厂模式(闭包工厂)
var CarFactory = (function(){
  //用于承装已经生产好的 car 
  var createdCars = {} ;
  return {
    createCar: function(make ,model , year ){
      //如果 createdCars 对象里已经存在当前的 make ,model , year
      if(createdCars[make+model+year]){
        return createdCars[make+model+year];
      } else {
        var car = new Car(make ,model , year);
        createdCars[make+model+year] = car ;
        return car ;
      }
    }
  };
})();

// 单例模式(外在数据 和 内在数据 结合在一起)
const CarRecordManager = (function(){
  // 把登记好的汽车放在这个对象里
  const = carRecordDataBase = {};
  return {
    addCarRecord: function(make ,model , year , owner , tag , renewDate) {
      const car = CarFactory.createCar(make ,model , year);
      carRecordDataBase[tag] = {
        owner : owner , 
        renewDate : renewDate ,
        car : car 
      };
    },
    renewRegistration:function(tag , newRenewDate){
      carRecordDataBase[tag].renewDate = newRenewDate;
    }    
  }
})();

const arr = [] ;
const stime = new Date().getTime();
for(var i = 0 ; i < 5000000; i ++){
  // runtime: 734ms  web: 570
  // arr.push(new Car('上海大众','迈腾','2012-02-03','bhx','bj0011','2013-04-01'));
  //享元模式的测试
  // runtime: 15m(3m - 5m)  web: 230
  arr.push(CarRecordManager.addCarRecord('上海大众','迈腾','2012-02-03','bhx','bj0011','2013-04-01'));
}
const etime = new Date().getTime();
alert(etime - stime);

模拟 web 日历

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

自由范儿

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

巷子口的你

文章 0 评论 0

微信用户

文章 0 评论 0

神妖

文章 0 评论 0

7460852697

文章 0 评论 0

ligengkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文