Skip to content

单例模式

有些使用我们不希望每一次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 若为销毁则一直是同一个实例,销毁后则创建一个新的实例

一个让开发效率增倍的组件库