# 单例模式

# 定义

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

# 简单实现

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

这种方式不能通过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

把创建实例对象的职责和管理单例的职责分离开