luoxue-victor / my-blog

公众号【前端技匠】作者

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

专题3: 设计模式之单例模式

luoxue-victor opened this issue · comments

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

如果我们把代码编程比作是战争的话,那么设计模式就是兵法。不会兵法肯定打不过会兵法的,即使能打过也要付出更多的代价。

设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

目的:使用设计模式是为了可重用代码,让代码更容易被他人理解、保证代码的可靠性。

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点

特点

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

单例模式场景

  • 电脑上的文件,无论在任何地方修改文件,它都只有一份
  • 古代的皇帝,也只能有一个
  • vue-router 跟 vuex 的 install 也是单例
  • 其实 js 中的子面量对象就是一个天然单例

优缺点

优点

  1. 减少内存开支 单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了
  2. 减少性能开销 由于单例模式只生成一个实例,所以,减少系统的性能开销,当一个对象产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
  3. 避免对资源的多重占用 例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作
  4. 设置全局的访问点 优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

缺点

  1. 单例很难扩展
  2. 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

常用的单例模式有两种

  • 懒汉模式
// 懒汉式,只有在调用 getInstance 的时候才会实例化 Singleton
class Singleton {
  static instance = null;
  // 获取实例方法
  static getInstance() {
    return this.instance || (this.instance = new Singleton());
  }
}

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 == instance2); // true
  • 饿汉模式
// 饿汉式,在类初始化的时候就已经创建好了实例
class Singleton {
  static instance = new Singleton();
  // 获取实例方法
  static getInstance() {
    return this.instance;
  }
}

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 == instance2); // true