享元模式(Flyweight Pattern)
核心思想
享元模式正式为解决系统中对象数量过多,导致运行代价过高、性能下降等问题而诞生的。它通过将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,从而降低了内存的消耗。享元模式的本质是缓存共享对象,以减少内存使用。
使用场景:当系统中存在大量相似或相同的对象。
例子
在我们的应用程序中,我们希望用户能够添加书籍。所有书籍都有title 、 author和isbn编号!然而,图书馆通常不仅仅拥有一本书的一本:它通常拥有同一本书的多本。
如果同一本书有多个副本,那么每次创建一个新的书籍实例并不是很有用。相反,我们想要创建Book构造函数的多个实例,代表一本书。
typescript
class Book {
constructor(public title, public author, public isbn) {}
}让我们创建将新书添加到列表中的功能。如果一本书具有相同的 ISBN 编号,因此是完全相同的书籍类型,我们不想创建一个全新的Book实例。相反,我们应该首先检查这本书是否已经存在。
typescript
const books = new Map();
const createBook = (title, author, isbn) => {
const existingBook = books.has(isbn);
if (existingBook) {
return books.get(isbn);
}
};如果它还不包含图书的 ISBN 编号,我们将创建一本新书并将其 ISBN 编号添加到books集中。
typescript
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;
};createBook函数帮助我们创建一种类型的书籍的新实例。然而,图书馆通常包含同一本书的多本!让我们创建一个addBook函数,它允许我们添加同一本书的多个副本。它应该调用createBook函数,该函数返回新创建的Book实例,或返回已经存在的实例。
为了跟踪总册数,让我们创建一个bookList数组,其中包含图书馆中的图书总数。
typescript
const bookList = [];
const addBook = (title, author, isbn, availability, sales) => {
const book = {
...createBook(title, author, isbn),
sales,
availability,
isbn,
};
bookList.push(book);
return book;
};然后,我们可以有效地为该特定副本使用现有的Book实例,而不是每次添加副本时都创建一个新的Book实例。让我们创建 3 本书的 5 个副本:《哈利·波特》、《杀死一只知更鸟》和《了不起的盖茨比》。
typescript
addBook("Harry Potter", "JK Rowling", "AB123", false, 100);
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);完整代码
typescript
class Book {
constructor(public title, public author, public isbn) {}
}
const books = new Map();
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;
};
const bookList: Book[] = [];
const addBook = (title, author, isbn, availability, sales) => {
const book = {
...createBook(title, author, isbn),
sales,
availability,
isbn,
};
bookList.push(book);
return book;
};
addBook("Harry Potter", "JK Rowling", "AB123", false, 100);
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);