JavaScript设计模式之享元模式实例详解
程序员文章站
2023-12-12 18:13:22
本文实例讲述了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程序设计有所帮助。