A fine-grained instance used for efficient sharing of information that is contained elsewhere. 运用共享技术,有效地支持大量的细粒度对象

    • 该模式意在实现:内存的轻量占用,意在让相关的对象共享尽可能多的数据来减少应用程序内存的使用。
    • 在实践中,数据共享会涉及到获取多个对象使用的若干相似对象或者数据结构,以及将这些数据防盗一个单一的外部对象中。我们可以将该对象传递给依赖这些数据的对象,而不是在每一个对象中都存储同样重复的数据。
      • 应用在数据层:通过创建一个共享数据的实例来分发共享数据
        • Flyweight: 描述一个接口,通过这个接口可以接受并作用于外部状态
        • Concrete flyweight: 实现接口,并存储内部状态。其必须是可共享的,并且能够控制外部状态。
        • Flyweight factory: 创建并管理 flyweight 对象。确保合理共享 flyweight,并且如果我们需要某个单例的时候,可以查询这些对象,若存在则返回,否则新建这个 flyweight 对象。
      • 应用在DOM层
        • DOM 事件冒泡的应用

    适用性:

    • 大量对象的情形。
    • 因为使用大量对象,存在存储开销问题。
    • 对象的大多数状态都可变为外部状态。

    代码结构:

    1. // 享元优化的 Book
    2. var Book = function (ISBN, title, ...) {
    3. // 可以共享的数据属性
    4. this.ISBN = ISBN;
    5. this.title = title;
    6. ...
    7. };
    8. // 基本工厂
    9. var BookFactory = (function () {
    10. var books = {};
    11. return {
    12. createBook: function (ISBN, title, ...) {
    13. if (books[ISBN]) return books[ISBN];
    14. var book = new Book(ISBN, title, ...);
    15. }
    16. };
    17. })();
    18. // 外部状态的管理
    19. var BookManager = (function () {
    20. var bookinfo = {};
    21. return {
    22. addBookRecord: function (id, ISBN, title, ...) {
    23. var book = BookFactory.createBook(ISBN, title);
    24. bookinfo[id] = {
    25. book: book, // 此处为享元的引用
    26. borrowData: new Date(Date.now()).toLocalString(),
    27. ...
    28. }
    29. }
    30. ...
    31. };
    32. })();

    关联:

    • 通常 Flyweight 会和 State 以及 Strategy 模式一起使用。
    • 通过和 Composite 模式结合起来,使用共享「叶子节点」的有向无环图实现一个逻辑层次上的结构。