JS设计模式——单例模式

定义

限制一个类只能有一个实例,并提供一个全局的单一访问点。
简单的单例模式

在 JS 中,可以通过对象字面量的方式去创建一个实例对象。

var singleton = {
	prop1: 'foo',
	prop2: 'bar',
	method1: function() {
		console.log(123)
	}
}

上面就是一个简单单例模式的示例。如果需要添加私有变量和方法,可以把等号右边改成一个立即调用函数表达式。

到这里,怎么感觉和之前说的模块模式差不多了。其实之前说的模块模式就是一种简单的单例模式。

但是这种简单单例模式没法推迟它们的初始化。下面我们看比较复杂的单例模式。
惰性单例

所谓惰性单例就是在用到的时候才去初始化,那么我们做一下优化。

var singleton = (function() {
	var _instance
	
	function Init() {
		this.prop1 = 'foo'
		this.prop2 = 'bar'
		this.method1 =  function() {
			console.log(123)
		}
	}
	
	return function () {
		// 只实例化一次
		if (!_instance) {
			_instance = new Init()
		}
		return _instance 
	}
})()

// 使用
var instance1 = singleton()
var instance2 = singleton()
console.log(instance1 === instance2) // => true

上面的示例,首先使用了立即调用函数表达式,创建了独立的作用域。其次在内部使用了构造函数,并返回一个函数赋值给全局变量 singleton。在这个函数中对实例的存在进行了判断,保证当前构造函数实例个数唯一。

只有在需要使用的时候,调用 singeton 函数,便会返回一个实例,而且每次调用返回的都是同一个实例。这就实现了惰性单例。
[扩展] ES6

我们用 ES6 的 class 来重写下上面的单例模式。这里采用调用静态方法的方式来获取实例。

class Singleton {
	constructor() {
		this.prop1 = 'foo'
		this.prop2 = 'bar'
	}
	method1 () {
		console.log(123)
	}
	// 静态方法
	static getInstance() {
		if (!this.instance) {
			this.instance = new Singleton()
		}
		return this.instance 
	}
}

// 使用
const instance1 = Singleton.getInstance()
const instance2 = Singleton.getInstance()

console.log(instance1 === instance2) // => true

以上就是单例模式的内容。

作者:userkang
来源:CSDN
原文:https://blog.csdn.net/userkang/article/details/86694107
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值