JavaScript设计模式6单例模式
单例模式的定义:保证一个类只有一个实例,并且提供一个可以访问它的全局访问点。
以类为中心的传统面向对象语言的单例模式实现:
普通单例模式:
var Singleton = function(name){ this.name = name; this.instance = null; } Singleton.prototype.getName = function(){ alert(this.name) } Singleton.getInstance = function(name){ if( !this.instance ){ this.instance = new Singleton(name) } return this.instance; } var a = Singleton.getInstance("sven1") var b = Singleton.getInstance('sven1') alert(a === b)
//透明的单例模式,用户可以像正常创建对象那样创建单例. var createDiv = (function(){ var instance = null; 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('sven') var b = new createDiv('sven') alert(a == b)
//使用代理实现单例 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 proxySingleCreateDiv = (function(){ var instance; return function(html){ if(!instance){ instance = new CreateDiv(html) } return instance; } })() var a = new proxySingleCreateDiv('sven') var b = new proxySingleCreateDiv('sven')
javascript中单例模式实现:
// 封装单例逻辑 var getSingle = function(fn){ var result; return function(){ return result || (result = fn.apply(this, arguments)) } } var createLoginLayer = function(){ var div = document.createElement('div') div.innerHTML = "登录浮框" div.style.display = 'none' document.body.appendChild(div) return div; } var createSingleLoginLayer = getSingle(createLoginLayer)
Think Different, Make Different-编程是一个习惯