JavaScript单例模式

单例模式的定义是:保证一个类仅有一个实例,并提供一个全局访问的访问点。

方法一

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
  var  Account = function(name){

this.name = name;

this.instance = null;

}

Account.create = function(name){

if(!this.instance){

this.instance = new Account(name);

}

return this.instance;

}

var a = Account.create('a');

var b = Account.create('b');

console.log(a === b); //true

不过这个方法有个缺点就是我们通常都是用new 来实例化对象,而这边需用create方法来创建。

方法二

那我们将代码改进,将实例对象使用new来创建:

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
var  Account = ( function(name){

var instance = null;

var getSingleInstance = function(name){

if(instance)

return instance;

return instance = new Acc(name);

}

var Acc = function(name){

this.name = name;

}

return getSingleInstance;

})();

var a = new Account('a');

var b = new Account('b');

console.log(a===b); //true

上述代码采用的是闭包的形式来创建单例的,阅读起来相对比较麻烦,并且该函数不能公用。所以可以将创建单例的函数抽出来作为一个公共的function。

方法三

代码如下:

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
  var  Account = function(name){

this.name = name;

};

var createSingleInstance =function (fn){

var instance ;

return function(){

if(instance)

return instance;

return instance = new fn(arguments); //将函数委托给createSingleInstance构造

}

};

var getSingle = createSingleInstance(Account);

var a = getSingle('a');

var b = getSingle('b');

console.log( b === a);

总之:单例模式就是类构造出来的实例只有一个。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!