定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
实现单例模式
原理比较简单,就是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则再下一次获取该类的实例时,直接返回之前创建的对象。
var Singleton = function(name){
this.name = name;
}
Singleton.prototype.getName = function(){
console.log(this.name);
}
Singleton.getInstance = (function(name){
// 其实就是设置的一个开关,如果该开关存在就直接return
var instance = null;
return function(name){
if(!instance){
instance = new Singleton(name);
}
return instance;
}
})()
var a = Singleton.getInstance("a");
var b = Singleton.getInstance("ab");
console.log(a===b);
透明的单例模式
使用createDiv去创建一个唯一的div结点
var CreateDiv = (function(){
var instance;
var CreateDiv = function(html){
if(instance){
return instance;
}
this.html = html;
this.init();
return instance = this;
}
CreateDiv.prototype.init = function(){
var div = document.createElement('div');
div.innerHTML = this.html;
document.body.appendChild(div);
}
return CreateDiv;
})();
var a = new CreateDiv('a');
var b = new CreateDiv('b');
console.log(a===b); // true
用代理实现单例模式
var CreateDiv = function(html){
this.html = html;
this.init();
}
CreateDiv.prototype.init = function(){
var div = document.createElement('div');
div.innerHTML = this.html;
document.body.appendChild(div);
}
var ProxySingletonCreateDiv = ((function(){
var instance;
return function(html){
if(!instance){
instance = new CreateDiv(html);
}
return instance;
}
})();
var a = new ProxySingletonCreateDiv('a');
var b = new ProxySingletonCreateDiv('b');
上述代码中的ProxySingletonCreateDiv其实就是将单例的条件判断封装成一个函数,专门用来判断CreateDiv是否已经被实例化过。这种组合模式就叫做代理模式。
JS中实现单例模式
单例模式的核心就是 确保只有一个实例,并提供全局访问。
惰性单例
指的是在需要的时候才创建对象实例。