定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常使用在 线程池、全局缓存等方面。html
var Singleton = function (name) { this.name = name this.instance = null } Singleton.prototype.getName = function () { console.log(this.name) } Singleton.getInstance = function (name) { if(!this.instance){ this.instance = new Singleton(name) } } var a = Singleton.getInstance('张三') var b = Singleton.getInstance('李四') alert(a === b) // true 或者: var Singleton2 = function (name) { this.name = name } Singleton2.prototype.getName = function () { console.log(this.name) } Singleton2.getInstance = (function () { var instance = null; return function (name) { if(!instance){ instance = new Singleton2(name) } return instance } })() var c = Singleton2.getInstance('张三') var d = Singleton2.getInstance('李四') alert(c === d) // true
var Singleton = function (name) { this.name = name this.instance = null } Singleton.prototype.getName = function () { console.log(this.name) } Singleton.getInstance = function (name) { if(!this.instance){ this.instance = new Singleton(name) } } var a = Singleton.getInstance('张三') var b = Singleton.getInstance('李四') alert(a === b) // true 或者: var Singleton2 = function (name) { this.name = name } Singleton2.prototype.getName = function () { console.log(this.name) } Singleton2.getInstance = (function () { var instance = null; return function (name) { if(!instance){ instance = new Singleton2(name) } return instance } })() var c = Singleton2.getInstance('张三') var d = Singleton2.getInstance('李四') alert(c === d) // true
总结:虽然经过 Singleton.getInstance 来获取 Singleton 类的惟一对象,这种方式相对简单,但有 一个问题,就是增长了这个类的“不透明性”,Singleton 类的使用者必须知道这是一个单例类, 跟以往经过 new XXX 的方式来获取对象不一样,这里偏要使用 Singleton.getInstance 来获取对象。缓存
var Singleton = (function () { var instance = null var Singleton = function (name) { if(instance){ return instance } this.name = name this.init() return instance = this; } Singleton.prototype.init = function () { this.getName() } Singleton.prototype.getName = function () { console.log(this.name) } return Singleton })() var a = new Singleton('张三') var b = new Singleton('李四')
var Singleton = (function () { var instance = null var Singleton = function (name) { if(instance){ return instance } this.name = name this.init() return instance = this; } Singleton.prototype.init = function () { this.getName() } Singleton.prototype.getName = function () { console.log(this.name) } return Singleton })() var a = new Singleton('张三') var b = new Singleton('李四')
总结:假设咱们某天须要利用这个类从单例类变成 一个普通的可产生多个实例的类,那咱们必须得改写 Singleton 构造函数,把控制建立惟一对象 的那一段去掉,这种修改会给咱们带来没必要要的烦恼app
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 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; } })();
4. 通用惰性单例模式函数
// 1.咱们能够经过变量存不存在来决定单例代码是否执行 // 2.咱们须要把不变的部分隔离出来,管理单例的逻辑从代码中抽离出来 var Singleton = function (fn) { var instance; return function () { return instance||(instance=fn.apply(this,arguments)) } } var CreateDiv = function (content) { var div = document.createElement('div') div.innerHTML = content document.body.appendChild( div ); } var getSingleCreateDiv = Singleton(CreateDiv) getSingleCreateDiv('1111111')
// 1.咱们能够经过变量存不存在来决定单例代码是否执行 // 2.咱们须要把不变的部分隔离出来,管理单例的逻辑从代码中抽离出来 var Singleton = function (fn) { var instance; return function () { return instance||(instance=fn.apply(this,arguments)) } } var CreateDiv = function (content) { var div = document.createElement('div') div.innerHTML = content document.body.appendChild( div ); } var getSingleCreateDiv = Singleton(CreateDiv) getSingleCreateDiv('1111111')