在整个应用中共享单个全局实例
欢迎来到 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 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'}
});
最后,让我们总结一下单例模式的使用场景:
-
需要花费太多时间或资源来创建,但经常使用的对象。
-
由于单例模式在内存中只有一个实例,因此内存开销减少了,特别是当对象需要频繁地创建和销毁,并且在创建或销毁期间无法优化性能时,单例模式的优势非常明显。
如果您有任何问题,请随时给我留言。
欢迎关注公众号:文本魔术,了解更多