- 单例模式的定义:
单例模式,顾名思义,就是只能实例化一次。单例模式的核心思想就是 : 在该实例 不存在 的情况下,可以通过一个方法创建一个类实现 创建 类的新实例;如果实例已经 存在 ,它会简单返回该对象的 引用,请看下面的代码 :
let mySingleton = (function () { let instance; function init () { console.log ( '我是初始化方法' ); function privateMethod () { console.log ( '我是初始化的私有方法' ); } let priviteVariable = '我是初始化的私有变量'; let privateRandom = (Math.random () * 10).toFixed(2); // 我是初始化的私有变量,生成随机数 return { publicMethod: function () { console.log ( '我是初始化方法的公有方法' ); }, publicProperty: '我是初始化方法的公有属性', getNumber: function () { //我是初始化方法的公有方法 return privateRandom; // 初始化公有方法调用初始化私有方法 } }; }; return { getInstance: function () { if ( !instance ) { // 判断instance是否存在,如果不存在,让instance 引用 init(); instance = init (); } return instance; } }; }) (); let singleA = mySingleton.getInstance ().getNumber() let singleB = mySingleton.getInstance ().getNumber() console.log ('singleA的值为:'+singleA,',singleB的值为'+ singleB,singleA === singleB ); //输出为: 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
34
35
36
37上面代码的输出结果为 true,验证了如果实例已经 存在 ,它会简单返回该对象的引用。那如果不引用呢?是不是每次实例化都返回不同的随机数呢?我们验证一下:
let mySingleton = (function () { let instance; function init () { console.log ( '我是初始化方法' ); function privateMethod () { console.log ( '我是初始化的私有方法' ); } let priviteVariable = '我是初始化的私有变量'; let privateRandom = (Math.random () * 10).toFixed(2); // 我是初始化的私有变量,生成随机数 return { publicMethod: function () { console.log ( '我是初始化方法的公有方法' ); }, publicProperty: '我是初始化方法的公有属性', getNumber: function () { //我是初始化方法的公有方法 return privateRandom; // 初始化公有方法调用初始化私有方法 } }; }; return { getInstance: function () { instance = init ();// 这里我们不判断instance,则每次都会实例化instance; return instance; } }; }) (); let singleA = mySingleton.getInstance ().getNumber() let singleB = mySingleton.getInstance ().getNumber() console.log ( singleA === singleB ); // false
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
34以上就是Javascript的单例模式.