设计模式: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 类时,有三个关键步骤:
-
定义私有静态属性来保存对象实例;
-
定义一个私有构造函数;
-
提供一个静态方法来获取对象实例。
在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 methodfunction 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'}});
最后,让我们总结一下单例模式的使用场景:
-
需要花费太多时间或资源来创建,但经常使用的对象。
-
由于单例模式在内存中只有一个实例,因此内存开销减少了,特别是当对象需要频繁地创建和销毁,并且在创建或销毁期间无法优化性能时,单例模式的优势非常明显。
如果您有任何问题,请随时给我留言。
欢迎关注公众号:文本魔术,了解更多

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)