- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
总结JavaScript设计模式编程中的享 元模式使用
享元模式不同于一般的设计模式,它主要用来优化程 序的性能,它最适合解决大量类似的对象而产生的性能问 题。享元模式通过分析应用程序的对象,将其解析为内在 数据和外在数据,减少对象的数量,从而提高应用程序的 性能。
基本知识
享元模式通过共享大量的细粒度的对象,减少对象的 数量,从而减少对象的内存,提高应用程序的性能。其基 本思想就是分解现有类似对象的组成,将其展开为可以共 享的内在数据和不可共享的外在数据,我们称内在数据的 对象为享元对象。通常还需要一个工厂类来维护内在数据。
在js中,享元模式主要有下面几个角色组成:
客户端:用来调用享元工厂来获取内在数据的类, 通常是应用程序所需的对象,
享元工厂:用来维护享元数据的类
享元类:保持内在数据的类
享元模式的实现和应用
一般实现
我们举个例子进行说明:苹果公司批量生产iph one,
iPhone的大部分数据比如型号,屏幕都是一样,少数部分 数据比如内存有分16G, 32G等。未使用享元模式前,我们 写代码如下:
functionl phone (model , screen, mem ory, SN) {
n bsp; this? mo del=model;
nbsp:this? screen=scre en;
nbsp: t his? memory=memory;
nbsp ;this? SN=SN ;
} varphones =[];
for (v ari=0; ilt; 1 000000; i++) {
nbsp; var memory=i%2==0? 16:32;
nbsp;phones ?push(newlp hone(〃iphon e6s〃, 5.0, me mory, i));
}
这段代码中,创建了一百万个iphone,每个iphone都 独立申请一个内存。但是我们仔细观察可以看到,大部分 iphone都是类似的,只是内存和序列号不一样,如果是一 个对性能要求比较高的程序,我们就要考虑去优化它。
大量相似对象的程序,我们就可以考虑用享元模式去 优化它,我们分析出大部分的iphone的型号,屏幕,内存 都是一样的,那这部分数据就可以公用,就是享元模式中 的内在数据,定义享元类如下:
function IphoneFlywe ight (model, screen, memo ry) {
nbsp;this? model二model;
nbs p; this? sere en=screen;
nbsp;this? memory=memo ry;
}
我们定义了iphone的享元类,其中包含型号,屏幕和 内存三个数据。我们还需要一个享元工厂来维护这些数据:
varf ly weightFacto ry=(functio n() {
nbsp: va riphones= {};
nbspjretur n{
nbsp;nb sp:get:fline tion(model, screen, memo ry) {
nbsp; nbsp; nbsp; v arkey=model +screen+mem ory;
nbsp;nbsp;nbsp; i f (! iphones[key]) {
nbs p;nbsp;nbsp ;nbsp;iphon es[key]=new
IphoneFlywe ight (model, screen, memo ry);
nbsp;nb sp: nbsp:}
nbsp; nbsp; n bsp; returni phones [key];
nbsp;nbsp;}
nbsp;};
})();
在这个工厂中,我们定义了一个字典来保存享元对象, 提供一个方法根据参数来获取享元对象,如果字典中有则 直接返回,没有则创建一个返回。
接着我们创建一个客户端类,这个客户端类就是修改 自 iphon e 类:
functi onlphone (mo del, screen, memory, SN) {
nbsp;this ? flyweight二 flyweightFa ctory. get(m odel, screen , memory);
nb sp;this. SN=SN;
}
然后我们依旧像之间那样生成多个i phone
varpho nes=[];
fo r (vari=0; il t; 1000000; i ++) {
nbsp: varmemory=i %2==0?16:32 ;
nbspjpho nes? push(ne wlphone (,zip hone6s〃,5. 0 , memory, i));
}
console? 1 og(phones);
这里的关键就在于I phone构造函
文档评论(0)