11-JavaScript设计模式——享元模式

通过享元模式大幅减少内存占用,将实例创建优化为共享内在不变数据,外部数据则单独管理,有效降低资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。


先观察以下场景:

// Car类:属性: 出厂商,型号,出厂日期,拥有者,车牌号,登记日期
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;
};
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++){
  arr.push(new Car('上海大众', '辉腾', '2017-06-09', 'Jagger', '浙A10086', '2017-07-01'));
}

var etime = new Date().getTime();

alert(etime - stime);
// 运行时间 1.5s; 内存占用 505M;
// 内存占用太多,看来有必要优化一下



下面使用 享元模式 来优化一下:
// 享元模式:内存优化
/*
  享元模式:
    内在数据(出厂商,型号,出厂日期 等不会发生变化的数据) 
    外在数据(拥有者,车牌号,登记日期 等会变化的数据)
*/
// Car类:属性: 出厂商,型号,出厂日期,拥有者,车牌号,登记日期
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 createCars = {};
  return {
    createCar : function(make, model, year){
      // 如果createCars对象里已经存在了当前的make, model, year
      if(createCars[make+model+year]){
        return createCars[make+model+year];
      }else{
        var car = new Car(make, model, year);
        createCars[make+model+year] = car;
        return car;
      }
    }
  };
})();

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

// 享元模式的测试
var arr = [];

var stime = new Date().getTime();

for(var i = 0; i < 5000000;i++){
  arr.push(CarRecordManager.addCarRecord('上海大众', '辉腾', '2017-06-09', 'Jagger', '浙A10086', '2017-07-01'));
}

var etime = new Date().getTime();

alert(etime - stime);
// 运行时间 3.5s; 内存占用 71M;
// 我们对比一下,内存占用大大减小了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值