设计模式(十一):享元模式

简介:

享元(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 ) {
        return existingBook;
      } else {
        var book = new Book( title, author, genre, pageCount, publisherID, ISBN );
        existingBooks[ISBN] = book;
        return book;
      }
    }
  };
})();
 
//书籍记录管理器单例
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 = new Date();
      return currentDate.getTime() > Date.parse( bookRecordDatabase[bookID].dueReturnDate );
    }
  };
})();
复制代码

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

(2)用于DOM层

HTML:

复制代码
<div id="container">
  <div class="toggle" href="#">More Info (Address)
      <span class="info">
          This is more information
      </span></div>
  <div class="toggle" href="#">Even More Info (Map)
      <span class="info">
          <iframe src="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


本文转自 海角在眼前 博客园博客,原文链接:  http://www.cnblogs.com/lovesong/p/5700695.html ,如需转载请自行联系原作者

http://www.cnblogs.com/lovesong/p/5700695.html

相关文章
|
4月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
80 4
|
4月前
|
设计模式
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
|
19天前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
2月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
39 6
|
3月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
3月前
|
设计模式 存储 Java
Java设计模式之享元模式详解
Java设计模式之享元模式详解
|
3月前
|
设计模式
享元模式-大话设计模式
享元模式-大话设计模式
|
4月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
4月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
56 0
|
4月前
|
设计模式 存储 Java
小谈设计模式(27)—享元模式
小谈设计模式(27)—享元模式