跳到主要内容

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少对象的内存使用和提高性能,通过共享相似对象之间的共同状态,以减少重复创建对象的开销。享元模式适用于需要大量相似对象的场景,其中每个对象的状态可以分成内部状态(不变的)和外部状态(可变的)。

享元模式的主要思想是将对象分为可共享的内部状态和不可共享的外部状态。内部状态存储在享元对象内部,而外部状态存储在客户端代码中。客户端代码负责管理外部状态,并将其传递给享元对象,以便在不同情况下共享相似对象。

场景

大量相似对象:当需要大量相似对象,但这些对象共享相同的内部状态时,使用享元模式可以大大减少内存使用。

性能优化:享元模式可以用于性能优化,减少对象的创建和销毁开销,特别是在有限资源的环境中。

缓存机制:享元模式通常用于实现缓存机制,以提高数据访问的速度。

实现

// 享元对象
class Book {
constructor(title, author) {
this.title = title;
this.author = author;
}
}

// 享元工厂
class BookFactory {
constructor() {
this.books = {};
}

getBook(title, author) {
if (!this.books[title]) {
this.books[title] = new Book(title, author);
}
return this.books[title];
}

getBookCount() {
return Object.keys(this.books).length;
}
}

// 客户端代码
const bookFactory = new BookFactory();

const book1 = bookFactory.getBook("Book A", "Author 1");
const book2 = bookFactory.getBook("Book B", "Author 2");
const book3 = bookFactory.getBook("Book A", "Author 1"); // 重复书籍

console.log(book1 === book2); // false,不同书籍
console.log(book1 === book3); // true,相同书籍

console.log(`Total books created: ${bookFactory.getBookCount()}`);

在上面的示例中,Book 是享元对象,它具有内部状态(title 和 author)。BookFactory 是享元工厂,它管理已创建的书籍对象,并确保不会重复创建相同书籍。客户端代码通过工厂获取书籍对象,如果书籍对象已存在,工厂将返回现有对象;否则,工厂将创建一个新对象。

享元模式通过共享相同的内部状态来减少内存消耗,特别适用于大量相似对象的情况。在上述示例中,工厂只维护唯一的书籍对象,从而大大减少了内存使用。