当前位置: 移动技术网 > IT编程>开发语言>JavaScript > JavaScript设计模式之享元模式实例详解

JavaScript设计模式之享元模式实例详解

2019年05月30日  | 移动技术网IT编程  | 我要评论
本文实例讲述了javascript设计模式之享元模式。分享给大家供大家参考,具体如下: 通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的

本文实例讲述了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程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网