# 单例模式/单体模式
- 定义:使用方法创建对象的时候,我们无论创建多少次对象都指向同一个。是设计模式中最常用的一种。
- 例子:
function notSingle(){
return {
a: 1
}
}
var a = notSingle()
var b = notSingle()
console.log(a===b) // false
function notSingle2(){
this.a = 123
}
var a1 = new notSingle2()
var b1 = new notSingle2()
console.log(a===b) // false
/*
以上表明无论用函数还是构造函数,创建出的对象都是独立的,在对数情况下是可以的。
但有时后就需要确保多数创建的对象是相同的。比如登录框,每个页面都要有一个登陆。第一次用这个方法创建了登录框,然后第二次再创建时候,希望返回的是已经被创建的对象,而不是再去创建新的。这种场景下就要去判断是否创建过,没有创建过,就要去创建并缓存这个对象,再次使用时就缓存除这个对象,重点是缓存这个对象。
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 单例模式例子:
var _unique = null // 核心:缓存一个对象
function createSingle(){
var obj = {
a: 1
}
if(_unique === null){
_unique = obj
}
return _unique
}
var a = createSingle()
// _unique = null // 可以让单例失效,这个操作是将缓存清掉了,这样很危险。所以如果将_unique保护起来,变成私有属性或变量就可
var b = createSingle()
console.log(a===b) // true
// 安全的单例模式,使用闭包,将_unique私有
var createSingle = (function(){
var _unique = null
function single(){
return {
a: 1
}
}
return function(){
if(_unique === null){
_unique = single()
}
return _unique
}
})()
var a = createSingle()
var b = createSingle()
console.log(a===b) // true
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
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