享元(Flyweight)模式是一种经典的结构型设计模式,用于优化重复、缓慢及数据共享效率较低的代码。它旨在通过与相关对象共享尽可能多的数据来减少应用程序中内存的使用。

应用场景

(1)用于数据层,处理内存中保存的大量相似对象的共享数据。

(2)用于DOM层,Flyweight用作中央事件管理器,来避免将事件处理程序附加到父容器中的每个子元素上,而是将事件处理程序附加到这个父容器上。

示例

(1)用于数据层。管理图书馆中的所有书籍,享元优化。

//每种书的数据,作为共享数据。
var Book = function( title, author, genre, pageCount, publisherID, ISBN ) {this.title =title;this.author =author;this.genre =genre;this.pageCount =pageCount;this.publisherID =publisherID;this.ISBN =ISBN;
};//书籍单例,获取共享数据(书籍)的方法。
var BookFactory = (function() {var existingBooks ={}, existingBook;return{createBook:function( title, author, genre, pageCount, publisherID, ISBN ) {existingBook=existingBooks[ISBN];if ( !!existingBook ) {returnexistingBook;}else{var book = newBook( title, author, genre, pageCount, publisherID, ISBN );existingBooks[ISBN]=book;returnbook;}}};
})();//书籍记录管理器单例
var BookRecordManager = (function() {var bookRecordDatabase ={};return{//添加新书addBookRecord: function( id, title, author, genre, pageCount, publisherID, ISBN, checkoutDate, checkoutMember, dueReturnDate, availability ) {var book =bookFactory.createBook( title, author, genre, pageCount, publisherID, ISBN );bookRecordDatabase[id]={checkoutMember: checkoutMember,checkoutDate: checkoutDate,dueReturnDate: dueReturnDate,availability: availability,book: book};},updateCheckoutStatus:function( bookID, newStatus, checkoutDate, checkoutMember, newReturnDate ) {var record =bookRecordDatabase[bookID];record.availability=newStatus;record.checkoutDate=checkoutDate;record.checkoutMember=checkoutMember;record.dueReturnDate=newReturnDate;},extendCheckoutPeriod:function( bookID, newReturnDate ) {bookRecordDatabase[bookID].dueReturnDate=newReturnDate;},isPastDue:function( bookID ) {var currentDate = newDate();return currentDate.getTime() >Date.parse( bookRecordDatabase[bookID].dueReturnDate );}};
})();

每本书除了作为共享数据的书籍信息(内部数据)外,还有额外借出人、借出日期、归还日期等外部数据,完全相同的书可以共享书籍信息。

(2)用于DOM层

HTML:

<divid="container"><divclass="toggle"href="#">More Info (Address)<spanclass="info">This is more information</span></div><divclass="toggle"href="#">Even More Info (Map)<spanclass="info"><iframesrc="http://www.map-generator.net/extmap.php?name=London&amp;address=london%2C%20england&amp;width=500...gt;"</iframe></span></div>
</div>

JS:

var stateManager ={fly:function() {var self = this;$("#container").unbind().on("click", "div.toggle", function( e ) {self.handleClick( e.target );});},handleClick:function( elem ) {elem.find("span" ).toggle( "slow");}
};

通常在构建我们自己的菜单、accordion组件或其他基于列表的小部件时,我们要做的就是将一个点击事件绑定至父容器中的每个链接元素上。

其实不需将点击绑定至多个元素,我们可以将享元附加到容器的顶部,它可以监听来自下面的事件。这样的优点是,可以将很多独立的动作转变成一个共享的动作(可能会节省内存)。

总结

可能在写前端代码的时候,大家(包括我)都不会大注意内存的使用,有时的确存在冗余对象,但因为影响不大,就不大注意。不过既然知道好的写法是怎么样,我觉得可以这样写,养成一个好习惯。

参考文献

1. 《JavaScript设计模式》by 徐涛【译】

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5700695.html

转载于:https://www.cnblogs.com/lovesong/p/5700695.html

设计模式(十一):享元模式相关推荐

  1. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  2. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  3. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

  4. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

  5. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  7. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  8. 【设计模式】享元模式(C#)

    [设计模式]享元模式 1.概述 Flyweight Design Pattern,结构型模式.享元模式中的"享元"指被共享的单元.享元模式通过复用对象,以达到节省内存的目的. 用于 ...

  9. Java设计模式之享元模式

    Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...

  10. C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样理解 ...

最新文章

  1. java properties更新_对Java配置文件Properties的读取、写入与更新操作
  2. 如何探测浏览器是否开启js功能
  3. 多种方法巧妙优化数据库
  4. 微软:明明修复了Bug,你们还把我骂上热搜?
  5. QPW 点评表(tf_appraise)
  6. JDBC最基本CRUD操作工具类
  7. 转:【HTTP】常见错误码说明
  8. codeforces 690D2 D2. The Wall (medium)(组合数学)
  9. 力扣题目系列:204. 计数质数
  10. java 日语文档翻译_日语文档怎么翻译?我来教会你日语翻译
  11. Office 2210 能打钩的复选框
  12. 256K,320K及以上Nero AAC,QAAC,FAAC,MP3,OGG等主流有损音频格式横评
  13. 计算机用户禁用更改登记,注册表被禁用的解法.doc
  14. 你的孤独,正在撑起一个万亿级市场
  15. 解决Ubuntu 安装时Unable to fetch some archives connection failed [ip: 91.189.91.39 80]
  16. 一不小心就触碰红线...程序员必须知道的法律知识有哪些?
  17. [转]oracle EBS 基础100问
  18. Tensorflow某段程序复现
  19. Golang 浮点数运算 避免精度损失 Decimal包
  20. wince 默认输入法_wince下中文输入法

热门文章

  1. 系统科学专业 计算机,2018年北京市培养单位数学与系统科学研究院863计算机学科综合(专业)之计算机操作系统考研核心题库...
  2. layui列表筛选列_layui框架的table字段筛选功能介绍
  3. 为什么java.lang包下的类不需要手动导入
  4. Windows核心编程_静态编译和动态编译的区别
  5. 实时操作系统与非实时操作系统的区别
  6. 如何向 Linux Kernel 提交 Patch
  7. 03.学习笔记-Linux下根目录介绍
  8. 软件开发工具--自考2019年4月
  9. Python入门——运行python的两种方式变量常量
  10. spring boot 2.0 与FASTDFS进行整合