轻量级模式

2/21/2022 设计模式轻量级模式

# 轻量级模式

使用相同对象时重用现有实例

# 简介

当我们创建大量类似的对象时,flyweight模式是一种保存内存的有用方法。

image-20220221233728767

# 实现

在我们的应用程序中,我们希望用户能够添加书籍。所有的书都有标题、作者和isbn编号!然而,图书馆通常不会只有一本书的副本:它通常有同一本书的多个副本。

如果同一本书有多个副本,那么每次都创建一个新的图书实例就不是很有用了。相反,我们希望创建Book构造函数的多个实例,它们表示单个Book。

class Book {
  constructor(title, author, isbn) {
    this.title = title;
    this.author = author;
    this.isbn = isbn;
  }
}

const books = new Map();
const bookList = [];

const addBook = (title, author, isbn, availability, sales) => {
  const book = {
    ...createBook(title, author, isbn),
    sales,
    availability,
    isbn
  };

  bookList.push(book);
  return book;
};

const createBook = (title, author, isbn) => {
  const existingBook = books.has(isbn);

  if (existingBook) {
    return books.get(isbn);
  }

  const book = new Book(title, author, isbn);
  books.set(isbn, book);

  return book;
};

console.log(addBook("Harry Potter", "JK Rowling", "AB123", false, 100))
console.log(addBook("Harry Potter", "JK Rowling", "AB123", true, 50))
addBook("To Kill a Mockingbird", "Harper Lee", "CD345", true, 10);
addBook("To Kill a Mockingbird", "Harper Lee", "CD345", false, 20);
addBook("The Great Gatsby", "F. Scott Fitzgerald", "EF567", false, 20);

console.log("Total amount of copies: ", bookList.length);
console.log("Total amount of books: ", books.size);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  • 使用map来保存已经存在的对象
  • 使用list来保存图书的总数量
  • 复用了同一isbn的实例对象

# 优点

  • 当创建大量对象时,flyweight模式非常有用,因为这些对象可能会耗尽所有可用的RAM。
  • 它允许我们将消耗的内存量最小化。 在JavaScript中,我们可以通过原型继承很容易地解决这个问题。
  • 如今,硬件拥有gb的RAM,这使得次量级模式变得不那么重要。
Last Updated: 2/22/2022, 9:20:59 PM