1.定义:保证一个类仅有一个实例,并提供一个全局访问入口。
2.应用场景描述:比如全局缓存对象、单击登录按钮弹出的登录浮窗等。
3.单例模式实现
- 标准单例模式
var Singleton = function(name){
this.name = name;
};
Singleton.prototype.getName = function(){
return this.name;
};
Singleton.getInstance = (function(){
var instance = null;
return function(name){
if(!instance){
instance = new Singleton(name);
}
return instance;
};
})();
//测试
var a = Singleton.getInstance("name1");
var b = Singleton.getInstance("name2");
console.log(a === b);//true
- 透明单例模式,所谓“透明”就是可以像普通类一样创建对象
var Singleton = (function(){
var instance = null;
var Singleton = function(name){
if(instance){
return instance;
}
this.name = name;
return instance = this;
};
return Singleton;
})();
//测试
var a = new Singleton("name1");
var b = new Singleton("name2");
console.log(a === b);//true
//其他单例写法
function SingleObj(name){
if(!SingleObj.instance){
this.name = name;
SingleObj.instance= this;
}
return SingleObj.instance;
}
4.通用单例创建,根据单一职责原则,把对象创建部分和单例部分分开
//单例部分
var getSingle = function(fn){
var instance = null;
return function(){
return instance || (instance = fn.apply(this,arguments));
};
}
//创建对象部分
var createObj = function(name){
var Singleton = function(name){
this.name = name;
};
Singleton.prototype.getName = function(){
return this.name;
};
return new Singleton(name);
}
var getSingleton = getSingle(createObj);
//测试
var demo = getSingleton("哈哈");
console.log(demo.getName());
总结:经验帮助我们思考,不断地探究才会写出更好的代码。