单例模式
单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
在软件开发中,有些情况下只需要一个全局唯一的对象来协调和管理特定资源或功能。单例模式通过限制类的实例化次数,确保只有一个实例存在,并提供一种访问该实例的机制。
单例模式的特点包括:
- 单一实例:单例模式保证只有一个实例存在,无论在何处调用,始终获取到相同的实例对象。
- 全局访问:通过提供一个全局访问点,可以让其他对象或模块方便地获取到单例实例,统一管理和使用。
- 延迟实例化:单例对象通常是在首次访问时被创建,而不是在程序启动时立即实例化,从而节省系统资源。
单例模式在实际应用中有多种用途,例如:
- 日志记录器:确保系统中只有一个日志记录器实例,负责记录和管理日志信息。
- 数据库连接池:维护数据库连接的对象池,确保只有一个连接池实例,提供可重用的数据库连接。
- 配置信息管理器:保存应用程序的配置信息,提供全局访问和管理配置项。
- 资源管理器:负责管理共享资源,如文件、网络连接等,确保资源的合理分配和释放。
需要注意的是,单例模式虽然在某些情况下提供了方便和效率,但也可能引入全局状态和隐藏依赖,导致代码的可测试性和可扩展性下降。因此,在使用单例模式时应谨慎考虑,并确保其在特定场景下的合理性和必要性。
TS实现单例模式
class Axios {
// 由于 instance 是一个静态属性,它会在整个应用程序的生命周期内保持存在,除非显式地将其设置为 null 或通过其他方式清除它的引用。
private static instance: Axios | null = null
url: string
timeout: number
// 通过把构造函数设为私有,防止外部通过 new 实例化
private constructor(url: string, timeout: number) {
this.timeout = timeout
this.url = url
}
static create(url: string, timeout: number): Axios {
if (Axios.instance === null) {
Axios.instance = new Axios(url, timeout)
}
return Axios.instance
}
}
// 要求是:所有实例均为一个
let axios1 = Axios.create('www.heima.com', 3000)
let axios2 = Axios.create('www.itcast.cn', 5000)
console.log(axios1, axios2);
console.log(axios2 === axios1) // true
// new Axios // 类“Axios”的构造函数是私有的,仅可在类声明中访问。
js实现单例模式
const singleton = (function () {
// 私有变量和方法
let instance;
function Init(name, age) {
this.name = name;
this.age = age;
}
Init.prototype.greet = function () {
console.log(
`Hello, my name is ${this.name} and I am ${this.age} years old.`
);
};
return {
getInstance: function (name, age) {
if (!instance) {
instance = new Init(name, age);
}
return instance;
},
};
})();
// 使用单例
const instance1 = singleton.getInstance("张三", 11);
const instance2 = singleton.getInstance("李四", 22);
console.log(instance1, instance2);
console.log(instance1 === instance2); // true,同一个实例