Javascript设计模式(三)单例模式

栏目: JavaScript · 发布时间: 7年前

内容简介:单例模式的定义是:保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的模式,有些对象我们往往只需要一个,比如线程池,全局缓存,window对象。要实现一个单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的时候,直接返回之前创建的对象。

单例模式的定义是:保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。

单例模式是一种常用的模式,有些对象我们往往只需要一个,比如线程池,全局缓存,window对象。

简单单例模式

要实现一个单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的时候,直接返回之前创建的对象。

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('sven2')  

alert(a===b) // true
复制代码

通过 Singleton.getInstance 来获取Singleton类的唯一对象,这种方式相对简单,但有问题,使用者并不知道这是一个单例类

用代理实现的单例模式

我们现在的目标是实现一个透明的单例类,用户从这个类中获取对象的时候,可以像使用其他普通类一样。并且按照 单一职责原则 ,createDiv类实现功能,proxySingletonCreateDiv类管理单例管理单例模式,达到可组合的的效果

// 创建普通类
var CreateDiv = function(html){
	this.html = html
	this.init()
}

CreateDiv.prototype.init = function() {
	var div = document.createComment('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('sven1')
var b = new proxySingletonCreateDiv('sven2')  

alert(a===b) // true
复制代码

惰性单例模式

分离 创建实例对象 的职责与 管理单例 的职责。下面用创建一个登陆框举例

// 管理单例
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)

document.getElementById('loginBtn').onclick = function(){
	var loginLayer = createLoginLayer()
}
复制代码

单例模式是一种简单但非常使用的技术,特别是惰性单例技术,在合适的时候才创建对象,并且至创建唯一的一个。更奇妙的是,创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Web Designer's Idea Book

The Web Designer's Idea Book

Patrick Mcneil / How / 2008-10-6 / USD 25.00

The Web Designer's Idea Book includes more than 700 websites arranged thematically, so you can find inspiration for layout, color, style and more. Author Patrick McNeil has cataloged more than 5,000 s......一起来看看 《The Web Designer's Idea Book》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具