只做你的唯一 ,JS中的单例模式的详细解析
前言
单例模式是一种广泛应用于软件工程中的设计模式,属于创建型模式的一种。它的核心目的是确保一个类在整个系统中仅有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种设计模式常用于那些需要频繁创建和销毁的对象管理,通过限制实例数量来节省系统资源,减少性能开销,同时保证对共享资源的控制更加集中和协调。
正文
例如:
在你未登入时,你点击登入,或者点赞,收藏等操作时,由于未登入,页面会弹出登入窗口,可是如果一直反复申请后台动态数据,对于前端的加载速度和服务器的请求压力都是有着巨大的压力,这时候就需要用到单例模式,可以通过管理全局状态、配置、资源和服务初始化等,为用户提供基础的服务保障,并为后续的登录过程及登录后的功能体验打下基础。
单例模式基本实现1
var Singleton = (function () {
var instance = null;
function Singleton() {
if (instance) {
return instance;
}
this.publicMethod = function () {
console.log("创建单例");
};
instance = this;
return this;
}
return Singleton;
})();
// 使用单例
var singleton1 = new Singleton();
singleton1.publicMethod(); // 输出: 创建单例
var singleton2 = new Singleton();
// singleton1 和 singleton2 指向相同的实例
console.log(singleton1 === singleton2); // 输出: true
在理解中是不是想,两个实例化对象怎么会相等,就算值一样也是不应该相等的啊对吧? 这里我先上个图解给大家解析一下:
在初次实例化之前,由于函数未被调用过,此时的函数的this是指向全局的,这里由于有关this指向的,我后买你会发文章讲解,可以留一手关注。
在初次实例化的时候,由于instan为空,所以会实例化对象this将指向实例化的对象,并返回给singleton1
在第二次实例化的时候,由于instan不为空了,所以new singleton并不会再创建新的对象来返回给singleton2,而是将第一次实例化singleton的对象地址返回给singleton2。
这个例子是使用闭包来实现了
单例模式基本实现2
下面我再用一个例子来实现单例模式:
const singleton=function (name){
this.name=name
this.instance=null
}
singleton.prototype.getName=function(){
console.log(this.name)
}
//静态方法
singleton.getInstance=function(){
if(!this.instance){
//静态属性
this.instance=new singleton()
}
return this.instance
}
//创建user1
let user1=singleton.getInstance("user1")
let user2=singleton.getInstance("user2")
console.log(user1===user2)//true
user1.getName()//user1
user2.getName()//user1
这里我创建定义了一个构造函数singleton
,它接受一个参数name
,并将其作为实例的name
属性。同时,它内部也定义了一个instance
属性,但在这个上下文中直接在构造函数内定义instance
并不是必需的,因为静态方法getInstance
将会管理这个唯一实例。
user1
和user2
都是通过调用singleton.getInstance
也是方法创建的。当user1
的在被创建时instance
为空,后面user2
使用singleton.getInstance
返回instanc
的内存位置。
所以在输出uesr2.name时,输出的却是“user1”。
总结
单例模式作为一种设计模式,确保了系统中特定类只有一个实例,并提供全局访问点以获取该实例,有利于资源管理和优化性能。在实际场景如登录控制、日志系统、数据库连接池中,单例模式通过限制实例数量降低系统负担,实现资源高效利用。实现上,可通过闭包或静态方法确保实例的唯一性,如示例代码所示,无论是通过立即执行函数还是构造函数加静态方法的方式,都确保了多次实例化请求返回相同对象实例,体现了单例的核心特征。
转载自:https://juejin.cn/post/7374984900372758564