# 单例模式
# 定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
# 简单实现
var Singleton = function(name) {
this.name = name
}
Singleton.prototype.getName = function() {
alert(this.name)
}
Singleton.getInstance = (function() {
var instance = null
return function(name) {
if (!instance) {
instance = new Singleton(name)
}
return instance
}
})()
var a = Singleton.getInstance('s1')
var b = Singleton.getInstance('s2')
alert(a === b)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这种方式不能通过new XXX来获取对象
# 惰性单例
var getSingle = function(fn) {
var result
return function() {
return result || (result = fn.apply(this, arguments))
}
}
function createElement() {
const div = document.createElement("div")
div.innerHTML = "只会插入一次"
document.body.append(div)
// 必须在这里返回Boolean为true的值,否则会多次执行
return div
}
var createSingleEle = getSingle(createElement)
console.log(new createSingleEle());
console.log(new createSingleEle());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
把创建实例对象的职责和管理单例的职责分离开