定义
限制一个类只能有一个实例,并提供一个全局的单一访问点。
简单的单例模式
在 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
版权声明:本文为博主原创文章,转载请附上博文链接!