Appearance
单例模式
有些使用我们不希望每一次new都创建一个新的对象,而是希望当不存在时创建一个新对象,
若对象存在则返回之前对象,故而封装了两个方法提供使用
getSingle
getSingle传入一个带返回值的函数,随后会得到一个函数fn,
首次运行fn会执行传入的函数并获取返回值
后续运行则获取之前运行的返回值
fn.destroy: 删除之前缓存的值,在这之后执行fn则会触发传入的回调函数
ts
import { getSingle } from '@ey-use/utils';
function createWin(html: any) {
const div = document.createElement('div');
div.innerHTML = html;
div.classList.add('aaa');
div.style.display = 'none';
document.body.appendChild(div);
return div;
}
const singleWin = getSingle(createWin);
// 多次调用只有第一次执行,后续只返回div且不执行创建
function open() {
const win = singleWin();
win.style.display = 'block';
}
function close() {
const win = singleWin();
win.style.display = 'block';
}getSingleClass
该方法与上面一致,支持此次返回的时class类,使用如下
ts
// 验证
const win1 = singleWin();
const win2 = singleWin();
console.log(win1 === win2); // true
// 类的单例模式
class Stu {
name = '';
constructor(name: string) {
console.log('执行构造函数');
this.name = name;
}
}
const singleStu = getSingleClass(Stu);
const stu = new singleStu('stu1');
const stu2 = new singleStu('stu2'); // 不会创建新实例 name为stu1
// 若你自己的class没有destroy则使用getSingleClass.destroy
singleStu.destroy();
const stu3 = new singleStu('stu3');
console.log(stu === stu2); //true
console.log(stu === stu3); //false 若为销毁则一直是同一个实例,销毁后则创建一个新的实例