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

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

内容简介:单例模式的定义是:保证一个类只有仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的模式,有些对象我们往往只需要一个,比如线程池,全局缓存,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()
}
复制代码

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


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

查看所有标签

猜你喜欢:

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

失控的真相

失控的真相

[美] 迈克尔·帕特里克·林奇 / 赵亚男 / 中信出版社 / 2017-6 / 42.00元

编辑推荐 在信息泛滥的时代,知识变得无处不在。鼠标轻轻一点,我们就坐拥一座巨型图书馆。然而,我们并没有因此就离真相更近。相反,互联网的普及使人们早已习惯于凡事问搜索引擎,并形成了一种“搜索即相信”的认知模式。当社交网络把数字人类带入一个个彼此隔绝的线上群体中,我们清楚地看到,真相与谎言在互联网中交织,知识与观念混为一谈,情绪宣泄掩盖了事实分析。联网的世界让我们更容易看到彼此的观点,但同时也制......一起来看看 《失控的真相》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具