最常见的单例Singleton设计模式,保证系统中的每一个类在任何情况实例化时候获得的都是同一个实例。 例如:
let l1 = new Parent()
let l2 = new Parent()
l1 === l2 // true
复制代码
JavaScript最常见实现单例模式有一下两种方法:
-
通过 ES6 中 proxy 代理 construct 构造函数
const singletonify = (Origin) => { let temp = new Origin return new Proxy(Origin, { construct: function(target, args, newTarget) { return temp } }) } //ps: ES6中proxy真的是神器,不仅可以替代Object.defineProperty来代理getter setter,还可以代理构造函数,apply函数执行等等方法) 复制代码
-
通过闭包实现
class Singleton { constructor() {} } Singleton.instance = () => { let singleInstance return () => { if(!singleInstance) { singleInstance = new Singleton() } return singleInstance } } 复制代码
单例设计模式优点:
1. 确保全局唯一只有一个实例;
2. 可以节约系统内存资源,由于内存中只存在单例一个对象实例,当在系统频繁创建删除对象时,可以极大节省内存;
3. 避免重复创建共享资源,避免了对共享资源的重复占用。
复制代码
单例设计模式缺点:
1. 不能保存彼此对象实例状态;
2. 对单例对象的扩展很难,只能用于全局共享资源等场景。
复制代码