单例模式的定义是:保证一个类仅有一个实例,并提供一个全局访问的访问点。
方法一
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);
|
不过这个方法有个缺点就是我们通常都是用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);
|
上述代码采用的是闭包的形式来创建单例的,阅读起来相对比较麻烦,并且该函数不能公用。所以可以将创建单例的函数抽出来作为一个公共的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);
|
总之:单例模式就是类构造出来的实例只有一个。