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);

从上述两个例子可以知道,第一个例子没有使用享元模式相对于第二个使用享元模式耗时间少,但空间消耗大,第二个耗时多,但空间消耗小。

第一种情况图解:每次都生成相同的实例

 

第二种情况:内在部分(不变)+外部状态(变化)图解

 

posted on 2017-10-19 21:44 WFaceBoss 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wfaceboss/p/7695606.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac屏幕截图_如何在Mac上拍摄屏幕截图

mac屏幕截图On a Mac, you can take screenshots with a few quick keyboard shortcuts. But Mac OS X also includes more powerful screenshot tools, too. Here are some of the many ways you can get a screenshot on OS X. 在Mac上&#xff0c;您可以使用一些快速的键盘快…

实现 .Net 7 下的数据库定时检查

在软件开发过程中&#xff0c;有时候我们需要定时地检查数据库中的数据&#xff0c;并在发现新增数据时触发一个动作。为了实现这个需求&#xff0c;我们在 .Net 7 下进行一次简单的演示。PeriodicTimer .Net 6 中新增了 PeriodicTimer 这个类&#xff0c;它可以用来创建一个定…

新手AS常见问题集锦

开发环境 以前开发android的时候可以使用eclipse&#xff0c;虽然现在也能使用eclipse&#xff0c;但是google已经不再支持使用eclipse开发android了。因为google有了自己的IDE---android studio&#xff0c;这个IDE我自己认为安装的时候比较方便&#xff0c;唯一的缺点就是在下…

js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)

js进阶 11-6 jquery如何获取和设置元素的宽高&#xff08;jquery多方法&#xff09; 一、总结 一句话总结&#xff1a;jquery里面多是方法啊&#xff0c;比如jquery对象的宽高。所以取值是方法&#xff0c;赋值就是方法里面带参数。 1、百度富文本编辑器ueditor如何设置宽高&a…

SparseArray代替HashMap

相信大家都明白&#xff0c;手机软件的开发不同于PC软件的开发&#xff0c;因为手机性能相对有限&#xff0c;内存也有限&#xff0c;所谓“寸土寸金”&#xff0c;可能稍有不慎&#xff0c;就会导致性能的明显降低。Android为了方便开发者&#xff0c;特意在android.util这个包…

也许你曾经读过他的书

我们愿用“能理能文、才华多元”来形容他。因为热爱编程和游戏&#xff0c;所以他将爱好变成了职业&#xff0c;并在这条路上持续奔跑&#xff1b;因为热爱分享&#xff0c;所以他坚持在博客上分享技术观点并出版了关于 Azure、微软游戏栈的书籍&#xff1b;因为热爱挑战&#…

python测试框架数据生成工具最全资源汇总

xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库&#xff0c;开箱即用unittest2 - 加强版的单元测试框架&#xff0c;适用于Python 2.7以及后续版本pytest - 成熟且功能强大的单元测试框架plugincompat - pytest的执行及兼容性插件nosetests -…

t30智能插座怎么设置_如何设置ConnectSense智能插座

t30智能插座怎么设置If you like the idea of smart outlets, but wish you had one with more than just one receptacle on it, the ConnectSense Smart Outlet is worth looking into. Here’s how to set it up and instantly get double the fun. 如果您喜欢智能插座的想法…

用链表和数组实现HASH表,几种碰撞冲突解决方法

Hash算法中要解决一个碰撞冲突的办法&#xff0c;后文中描述了几种解决方法。下面代码中用的是链式地址法&#xff0c;就是用链表和数组实现HASH表。 he/*hash table max size*/ #define HASH_TABLE_MAX_SIZE 40/*hash table大小*/ int hash_table_size0;/*.BH----------------…

安卓操作sqlite3,增删改查

创建 layout <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layo…

基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序

1前言上一篇留的坑&#xff0c;火速补上。在之前的第6篇中&#xff0c;已经有初步介绍&#xff0c;本文做一些补充&#xff0c;已经搞定这部分的同学可以快速跳过&#xff0c;基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表对标准的WebApi来说&#xff0c;分…

如何在Chrome中保存您当前的所有标签,以便以后阅读

Chrome allows you to open tabs from your last browsing session when you open the browser. However, what if you want to save your current set of tabs to re-open at any time? Chrome doesn’t provide a way to do that natively, but there is an easy workaround…

ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...

目录 前言回顾最终解决&#xff1a;0.关闭x服务1.禁用nouveau2.加入3.更新4.查找匹配驱动5.选择推荐版本6.等待安装后重启,nvidia-smi查看是否安装成功,或者lsmod | grep nvidia&#xff0c;成功结果如下7.重启x服务8.此时还不能进入图形界面&#xff0c;因为nomodeset还在&…

(备忘)打开office2010总是在配置进度

1、同时按上键盘上面的windows键和R键&#xff0c;出现“运行” 2、输入“regedit”&#xff0c;回车进入注册表 3、点击“HKEY_CURRENT_USER”展开&#xff0c;依次“Software”--“Microsoft”--“Office”--"14.0"--"Word"展开&#xff0c;点击"Op…

java、oracle对CLOB处理

oracle CLOB字段转换位VARCHAR 1.实际上处理CLOB字段的时候&#xff0c;直接TO_CHAR&#xff0c;当长度超过4000的时候&#xff0c;会报错&#xff0c;提示列被截取&#xff1b; CLOB转varchar2&#xff1a;select to_char(CLOB字段) from table 2.直接使用SUBSTR对CLOB字段进行…

android 更改软键盘_如何在Android的Google键盘上更改声音和振动

android 更改软键盘Tactile feedback from a touch screen keyboard is crucial, in my opinion, but I don’t like sounds when I tap keys. You may not be like me—maybe sounds are your thing, but vibration is annoying. Or maybe you dislike both (you rebel!). The…

『 再看.NET7』看看required属性有什么不同

还是先看看C#中属性的这定义&#xff0c;在初始化和访问上有哪些方式&#xff0c;就能看出required属性有什么不一样的地方了。属性&#xff0c;是封装字段的&#xff0c;通过get和set访问器可以很好地验证数据的有效性。public record Order_00 {public Guid Id { get; set; }…

知识点:Mysql 索引原理完全手册(1)

知识点&#xff1a;Mysql 索引原理完全手册(1) 知识点&#xff1a;Mysql 索引原理完全手册(2) 知识点&#xff1a;Mysql 索引优化实战(3) 知识点&#xff1a;Mysql 数据库索引优化实战(4) Mysql-索引原理完全手册 一、 介绍二、 索引的原理三、 索引的数据结构四、 聚集索引与辅…

如何将Apple Mail建议用于事件和联系人

Apple products come preinstalled with an email client that can, on occasion, be quite smart. Today we want to show you another great feature: suggestions for event and contacts. Apple产品预装了一个电子邮件客户端&#xff0c;该客户端有时可能非常聪明。 今天&a…

TPshop表结构

tp_account_log -- 账户表 字段名字段类型默认值描述log_idmediumint(8) unsigned 日志iduser_idmediumint(8) unsigned 用户iduser_moneydecimal(10,2)0.00用户金额frozen_moneydecimal(10,2)0.00冻结金额pay_pointsmediumint(9) 支付积分change_timeint(10) unsigned 变动时间…