目前遵循单一职责的原则, 单例的管理函数和单例的创建函数是分开的, 如下:
function handleSingleton (createFn){ // createFn是单例的创建函数(例如创建一个div元素等) let created = null return function (...rest) { return created || (created = createFn.apply(this, rest)) } }
但这样有个问题: 单例创建后无法有效地销毁. 为了解决这个问题, 增加了一个destroyFn
函数用于销毁闭包内的created
变量, 并根据传入的type
来决定是调用createFn
来创建单例, 还是调用destroyFn
来销毁单例:
function handleSingleton (createFn, destroyFn){ let created = null // 判断传入的type return function (type, ...rest) { if (type === 'create') { return created || (created = createFn.apply(this, rest)) } else if (type === 'destroy') { destroyFn.call(this, created, ...rest) created = null } else { throw new Error('\'type\' can either be \'create\' or \'destroy!\'') } } }
有没有更好的办法呢?
慕码人2483693
相关分类