likes
comments
collection
share

单例模式?其实就是你家里的冰箱

作者站长头像
站长
· 阅读数 25

单例模式?其实它就像你家里那个唯一的冰箱,听起来是不是亲切多了。

什么是单例模式

想象一下,你家里只有一个冰箱,一般它都放在厨房,不管你从哪个房间走进厨房,打开的永远是同一个冰箱门,对吧?单例模式就是这么个道理。在程序设计里,单例模式确保一个类只有一个实例,并提供一个全局访问点。也就是你在每个房间都可以走到厨房拿你想喝的小甜水。

为什么需要单例模式

我们还是回到冰箱的例子,如果你家里突然多了几个冰箱,每次你找小甜水的时候是不是还得想一想去哪一个冰箱,是不是挺烦人的。同样,拿数据库做例子,如果你的应用程序里有多个数据库连接对象,那管理起来是不是会很混乱,并且浪费资源。这就需要我们的单例模式登场了,它就类似于家里只放一个冰箱,确保你的应用程序中只有一个全局唯一的对象,确保了唯一性和全局访问性。

在程序设计中,它可以用来管理那些需要全局访问、但又只需要一个实例的对象,比如配置管理、日志记录、线程池等等。

代码实现

讲这么多,代码才是王道:

单例模式?其实就是你家里的冰箱

这是一个给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
评论
请登录