# 单例模式/单体模式

  1. 定义:使用方法创建对象的时候,我们无论创建多少次对象都指向同一个。是设计模式中最常用的一种。
  2. 例子:
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
  1. 单例模式例子:
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