知食记
搜索文档…
享元模式

定义

把对象的属性划分为内部和外部状态。
    内部状态:可以被对象集合共享,通常不会改变
    外部状态:根据应用场景经常改变
享元模式是利用时间换取空间的优化模式。

场景

只要是需要大量创建重复的类的代码块,均可以使用享元模式抽离内部/外部状态,减少重复类的创建。
耳熟能祥的应用案例就是对象池

JavaScript实现

1
// 对象池
2
class ObjectPool {
3
constructor() {
4
this._pool = []; //
5
}
6
7
// 创建对象
8
create(Obj) {
9
return this._pool.length === 0
10
? new Obj(this) // 对象池中没有空闲对象,则创建一个新的对象
11
: this._pool.shift(); // 对象池中有空闲对象,直接取出,无需再次创建
12
}
13
14
// 对象回收
15
recover(obj) {
16
return this._pool.push(obj);
17
}
18
19
// 对象池大小
20
size() {
21
return this._pool.length;
22
}
23
}
24
25
// 模拟文件对象
26
class File {
27
constructor(pool) {
28
this.pool = pool;
29
}
30
31
// 模拟下载操作
32
download() {
33
console.log(`+ 从 ${this.src} 开始下载 ${this.name}`);
34
setTimeout(() => {
35
console.log(`- ${this.name} 下载完毕`); // 下载完毕后, 将对象重新放入对象池
36
this.pool.recover(this);
37
}, 100);
38
}
39
}
40
41
/****************** 以下是测试函数 **********************/
42
43
let objPool = new ObjectPool();
44
45
let file1 = objPool.create(File);
46
file1.name = "文件1";
47
file1.src = "https://download1.com";
48
file1.download();
49
50
let file2 = objPool.create(File);
51
file2.name = "文件2";
52
file2.src = "https://download2.com";
53
file2.download();
54
55
setTimeout(() => {
56
let file3 = objPool.create(File);
57
file3.name = "文件3";
58
file3.src = "https://download3.com";
59
file3.download();
60
}, 200);
61
62
setTimeout(
63
() =>
64
console.log(
65
`${"*".repeat(50)}\n下载了3个文件,但其实只创建了${objPool.size()}个对象`
66
),
67
1000
68
);
Copied!
最近更新 2yr ago