A fine-grained instance used for efficient sharing of information that is contained elsewhere. 运用共享技术,有效地支持大量的细粒度对象。
- 该模式意在实现:内存的轻量占用,意在让相关的对象共享尽可能多的数据来减少应用程序内存的使用。
- 在实践中,数据共享会涉及到获取多个对象使用的若干相似对象或者数据结构,以及将这些数据防盗一个单一的外部对象中。我们可以将该对象传递给依赖这些数据的对象,而不是在每一个对象中都存储同样重复的数据。
- 应用在数据层:通过创建一个共享数据的实例来分发共享数据
- Flyweight: 描述一个接口,通过这个接口可以接受并作用于外部状态
- Concrete flyweight: 实现接口,并存储内部状态。其必须是可共享的,并且能够控制外部状态。
- Flyweight factory: 创建并管理 flyweight 对象。确保合理共享 flyweight,并且如果我们需要某个单例的时候,可以查询这些对象,若存在则返回,否则新建这个 flyweight 对象。
- 应用在DOM层
- DOM 事件冒泡的应用
- 应用在数据层:通过创建一个共享数据的实例来分发共享数据
适用性:
- 大量对象的情形。
- 因为使用大量对象,存在存储开销问题。
- 对象的大多数状态都可变为外部状态。
代码结构:
// 享元优化的 Book
var Book = function (ISBN, title, ...) {
// 可以共享的数据属性
this.ISBN = ISBN;
this.title = title;
...
};
// 基本工厂
var BookFactory = (function () {
var books = {};
return {
createBook: function (ISBN, title, ...) {
if (books[ISBN]) return books[ISBN];
var book = new Book(ISBN, title, ...);
}
};
})();
// 外部状态的管理
var BookManager = (function () {
var bookinfo = {};
return {
addBookRecord: function (id, ISBN, title, ...) {
var book = BookFactory.createBook(ISBN, title);
bookinfo[id] = {
book: book, // 此处为享元的引用
borrowData: new Date(Date.now()).toLocalString(),
...
}
}
...
};
})();
关联:
- 通常
Flyweight
会和 State 以及 Strategy 模式一起使用。 - 通过和
Composite
模式结合起来,使用共享「叶子节点」的有向无环图实现一个逻辑层次上的结构。