单例模式?其实就是你家里的冰箱
单例模式?其实它就像你家里那个唯一的冰箱,听起来是不是亲切多了。
什么是单例模式
想象一下,你家里只有一个冰箱,一般它都放在厨房,不管你从哪个房间走进厨房,打开的永远是同一个冰箱门,对吧?单例模式就是这么个道理。在程序设计里,单例模式确保一个类只有一个实例,并提供一个全局访问点。也就是你在每个房间都可以走到厨房拿你想喝的小甜水。
为什么需要单例模式
我们还是回到冰箱的例子,如果你家里突然多了几个冰箱,每次你找小甜水的时候是不是还得想一想去哪一个冰箱,是不是挺烦人的。同样,拿数据库做例子,如果你的应用程序里有多个数据库连接对象,那管理起来是不是会很混乱,并且浪费资源。这就需要我们的单例模式登场了,它就类似于家里只放一个冰箱,确保你的应用程序中只有一个全局唯一的对象,确保了唯一性和全局访问性。
在程序设计中,它可以用来管理那些需要全局访问、但又只需要一个实例的对象,比如配置管理、日志记录、线程池等等。
代码实现
讲这么多,代码才是王道:
这是一个给localStorage添加值和获取值的类,用的便是单例模式,当没有实例的时候,就创建,反之则返回当前的实例,为了让每次获取值时创建的对象都是同一个,我们直接在外部直接调用这里的静态getInstance()
方法:
注意:要使用这个Storage
类,我们需要通过Storage.getInstance()
来获取实例,而不是直接使用new Storage()
,因为后者可能会创建多个实例,就违背了我们单例模式的原则了。
这里我们创建了两个实例对象,但其实它俩是同一个“冰箱”,输出结果为:
我们也成功地将apple
放进了localStorage。
计分板
不仅冰箱,我们可以以计分板为例。想象你正在做一个游戏,这个游戏里有一个计分板,记录整个团队的分数。你肯定不希望每次有一个新玩家进入关卡,分数就重置一次。这时候,你就可以用单例模式来确保计分板只有一个实例,并且不管是哪个玩家,都能看到同一个分数。
class Scoreboard {
constructor() {
// 确保只有一个实例被创建
if (!Scoreboard.instance) {
this.score = 0; // 初始化得分
Scoreboard.instance = this;
}
return Scoreboard.instance;
}
// 增加得分
addPoints(points) {
this.score += points;
}
// 获取当前得分
getScore() {
return this.score;
}
// 静态方法,用于获取单例实例
static getInstance() {
if (!Scoreboard.instance) {
new Scoreboard(); // 如果还没有实例,则创建一个
}
return Scoreboard.instance;
}
}
// 使用示例
const player1 = Scoreboard.getInstance();
const player2 = Scoreboard.getInstance();
player1.addPoints(10); // 玩家1获得10分
console.log(player1.getScore()); // 玩家1查分 输出:10
player2.addPoints(5); // 玩家2获得5分
console.log(player2.getScore()); // 玩家2查分 输出:15
结合注释看完这段代码,我想单例模式就被你彻底击败了!!
结语
下次编写代码的时候,如果觉得某个对象应该像冰箱那样“独一无二”,记得用单例模式。
转载自:https://juejin.cn/post/7393533297894473779