设计模式:TypeScript中的单例模式

在整个应用中共享单个全局实例

欢迎来到 TypeScript 设计模式系列,该系列介绍了使用 TypeScript 进行 Web 开发的一些有用的设计模式。

 之前的文章如下:

设计模式对于 web 开发人员来说非常重要,掌握它们可以让我们写出更好的代码。在本文中,我将使用 TypeScript 来介绍单例模式。

单例模式是一种常见的模式,我们通常只需要某个对象的一个,比如全局缓存、浏览器中的window对象等。单例模式用于确保类只有一个实例,并提供一个全局访问点。

上图是我模拟了借车的过程,Chris1993有急事,向我借车,所以我把车借给了Chris1993,同一天Bytefish也需要车,向我借车,因为我家里只有一辆车,所以我没有车可以借。

对于汽车来说,它给生活带来了极大的便利,但同时它也需要相当数量的钱来维护汽车(停车费、汽油费和维护费等),所以我家只有一辆车。在开发软件系统时,如果遇到创建对象需要花费太多时间或消耗太多资源,但使用频率很高的对象,可以考虑使用单例模式。

让我们来看看如何使用 TypeScript 来实现单例模式。 

class Singleton {  private static singleton: Singleton; // ①  private constructor() {} // ②  public static getInstance(): Singleton { // ③    if (!Singleton.singleton) {      Singleton.singleton = new Singleton();    }    return Singleton.singleton;  }}

在定义  Singleton  类时,有三个关键步骤:

  1. 定义私有静态属性来保存对象实例;

  2. 定义一个私有构造函数;

  3. 提供一个静态方法来获取对象实例。


在VSCode编辑器中,对于私有的静态属性,编辑器的智能感知会自动过滤掉这些属性:

对于私有构造函数,当我们通过 new Singleton() 创建实例时,TypeScript 编译器会提示以下错误消息:

Constructor of class 'Singleton' is private and only accessible within the class declaration.ts(2673)

有了 Singleton 类,让我们验证一下它的功能:

let instance1 = Singleton.getInstance();let instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

在 JavaScript 中实现单例最简单的方法是使用对象字面量:

const httpClient = {  get(url, config) {    // send get request  },  post(url, config) {    // send post request  },};

如果你需要包含私有属性或方法,可以使用以下方法创建单例:

const httpClient = (function () {  // private method  function sendRequest(url, config) {    // send request  }  return {    get(url, config) {      return sendRequest(url, config);    },    post(url, config) {      return sendRequest(url, config);    },  };})();

如果你使用 ES6,你可以使用 ES Modules 非常轻松地表示单例:

export default {  get(url, config) {    // send get request  },  post(url, config) {    // send post request  },};

Axios 被广泛应用于各种 Web 项目中,它提供的  axios  对象也是一个单例对象。

import axios from "axios";
axios.get('/users')  .then(res => {    console.log(res.data); });

上面的  axios  实例使用的是默认的配置对象,当然,Axios 也允许我们使用  axios.create  方法来创建一个带有自定义配置的 Axios 实例。

const instance = axios.create({  baseURL: 'https://mediuem.com/',  timeout: 1000,  headers: {'X-Custom-Header': 'Bytefer'}});

最后,让我们总结一下单例模式的使用场景:

  • 需要花费太多时间或资源来创建,但经常使用的对象。

  • 由于单例模式在内存中只有一个实例,因此内存开销减少了,特别是当对象需要频繁地创建和销毁,并且在创建或销毁期间无法优化性能时,单例模式的优势非常明显。


如果您有任何问题,请随时给我留言。

 欢迎关注公众号:文本魔术,了解更多

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值