首先我们要知道单例模式不是代码,而是一种思想,所以我们要根据思想写出代码
定义:确保只有一个实例,并且能够自行实例化,同时并向整个系统提供实例。 也就是说它只能实例化一次,并且是自己实例的,然后对外提供一个全局的访问点
优点
- 由于单例模式在内存中只有一个实例,减少了内存的开支,同时也减少了性能开销
- 避免资源的多重占用
- 能设置全局访问点,优化资源访问和共享
缺点
- 单例模式扩展困难,若要扩展,除了修改代码基本上没有第二种方法,当然要根据开发环境而定
- 单例模式对测试不利,因为只有单例运行完才能进行测试,中途是不能测试的
- 单例默认容易与单一职责起冲突(单一职责:一个类,方法...对应一个职责)
单例模式在高并发情况下需要注意线程同步情况,当然JavaScript是单线程编程语言,所以可以忽略
代码实现:创建一个类,进行类实例化时,判断类实例对象是否存在,存在则返回实例对象,不存在则创建类实例对象,多次调用实例化方法,返回的都是同一个实例对象
实现一:
let CreateSingleTon = (function (){
let instance = null
return class {
constructor(name) {
if(instance) return instance
this.name = name
return instance = this
}
}
})()
let p1 = new CreateSingleTon("李雷")
let p2 = new CreateSingleTon("韩梅梅")
console.log(p1===p2)
代码中定义了一个CreateSingleTon变量来管理和控制类和类的实例化,我们可以使用new关键字来操创建实例对象,但是违反了单一职责
这里有两个职责:
- 类的创建
- 类的实例化 CreateSingleTon控制了这两个职责,
实现二:
class CreateSingle {
constructor(name,age) {
this.age = age
this.name = name
}
}
let MyCreateSingleTon = (function (){
let instance
return class {
constructor() {
if (instance) return instance
return instance = new CreateSingle(...arguments)
}
}
})()
var p11 = new MyCreateSingleTon("李雷",12)
var p22 = new MyCreateSingleTon("韩梅梅",12)
console.log(p11===p22)
代码中把类分开创建,MyCreateSingleTon只控制了实例化,符合了单一职责
我js菜鸡一名,不对的欢迎喷!!!