单例模式

在看《剑指Offer》的时候,看到单例模式的写法,以前只知道设计模式里有单例模式,但是它的写法,作用都不太了解,今天看到了,所以整理一下。

1、什么是单例模式

在维基百科上查到,

单例模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。

2、单例模式的实现思路

实现单例模式的思路是:

  • 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)
  • 当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用
  • 同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

3、JavaScript实现

根据上面思路,自己写了一个不太成熟的单例模式的类

class Singleton {
  static instance = null;
  name;
  // 在js里实现无法使用private标识符,
  // 所以还是可以通过new Singleton来生成多个实例
  // 如果可以用private,就是正规的单例模式了。
  constructor(name) {
	this.name = name;
  }
  static createInstance(name) {
	if (this.instance === null) {
	  this.instance = new Singleton(name);
	}
	return this.instance;
  }
}
const a = Singleton.createInstance('a');
const b = Singleton.createInstance('b');
console.log(a, b); // Singleton {name: "a"},Singleton {name: "a"}
console.log(a === b); // true
  • 通过静态属性 instance 来作为判断的标识
  • 通过静态方法 createInstance 来生成实例
  • 在ts里,可以让构造函数 私有,来避免直接new来生成实例。

4、使用场景

单例模式的特点,就是只维护一个全局实例对象。
所以:

  • 引用第三方库(多次引用只会使用一个库引用,如 jQuery)
  • 弹窗(登录框,信息提升框)
  • 购物车 (一个用户只有一个购物车)
  • 全局态管理 store (Vuex / Redux)
  • 还有自己的工具函数等

在这些场景下,可以使用单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值