新闻详情

新闻详情

首页 / 资讯中心 / 详情

单例用于创建用户的登录界面时起的作用

发布时间:2026/9/30 7:48:49来源:尧图网络
单例用于创建用户的登录界面时起的作用
整个梳理分为 5 个阶段。第一阶段最原始的代码为什么会有问题假设我们现在写代码。在面向对象里class类是图纸new是造房子。我们一开始写了一个普通的类// 普通类publicclassUserSession{publicStringusername;}现在有两个程序员小王写【登录页面】。小李写【个人中心页面】。小王的代码publicclassLoginPage{publicvoidlogin(){UserSessionsessionAnewUserSession();// 造了一栋房子AsessionA.username张三;// 在房子A里放了张三}}小李的代码publicclassProfilePage{publicvoidshow(){UserSessionsessionBnewUserSession();// 造了一栋房子BSystem.out.println(sessionB.username);// 去房子B里找名字}}问题爆发小李打印出来的结果是null。为什么因为小王造的是房子A小李造的是房子B。它们是在内存里两块完全不同的区域。小王在房子A里写了“张三”小李去房子B里找当然找不到。小李能“直接调用”小王的代码吗不能。因为sessionA是login()方法里面的局部变量。方法一执行完sessionA就被内存销毁了。小李在另一个类里根本看不见小王方法里的东西。第二阶段怎么解决单例模式登场为了解决“小王存的数据小李拿不到”的问题我们要搞一个全局唯一的公共容器。无论小王还是小李都必须往这个公共容器里存/取数据。这就是单例模式。我们给UserSession加上三把锁publicclassUserSession{// 第一把锁静态变量用来存唯一的实例全局唯一privatestaticUserSessioninstance;// 第二把锁私有构造函数。外部代码不能自己 new必须走下面那个方法privateUserSession(){}// 第三把锁公开的静态方法作为全局唯一入口publicstaticUserSessiongetInstance(){if(instancenull){instancenewUserSession();// 只有第一次调用时才会造一次}returninstance;// 以后所有人来都拿同一个}publicStringusername;}此时小王和小李的代码变成这样小王登录UserSessionsessionAUserSession.getInstance();// 去公共容器拿拿到了唯一的那一个sessionA.username张三;// 在里面写张三小李个人中心UserSessionsessionBUserSession.getInstance();// 去公共容器拿还是那唯一的一个System.out.println(sessionB.username);// 成功打印出张三为什么这次行了因为sessionA和sessionB在内存里指向的是同一个对象你可以理解为房子A和房子B是同一栋房子。为什么单例要“防止内部代码乱创建”如果你不把构造函数设为private小王可能忘了用getInstance()习惯性地写new UserSession()那他又造了一栋新房子数据又不互通了。单例模式用语法强制**所有人必须用getInstance()不许自己new。**这就是“防止内部代码乱创建保证全局状态一致”。第三阶段多用户怎么办单例是“容器”不是“人”你之前问“多用户的话单例存不下怎么办”这是一个很好的问题。注意单例本身是一个全局唯一的容器但容器里可以装很多东西。如果是多用户系统比如淘宝我们不能把张三和李四的数据直接放在UserSession的属性里会互相覆盖。我们要把UserSession变成普通的类多例然后用一个单例的 Manager来管理它们。// 单例的管理器publicclassSessionManager{privatestaticSessionManagerinstancenewSessionManager();privateSessionManager(){}publicstaticSessionManagergetInstance(){returninstance;}// 容器内部用一个 Map 存无数个普通的 UserSession 对象privateMapString,UserSessionmapnewHashMap();publicvoidadd(Stringtoken,UserSessionsession){map.put(token,session);}publicUserSessionget(Stringtoken){returnmap.get(token);}}张三登录new UserSession(张三)多例然后SessionManager.getInstance().add(token_1, 张三对象)。李四登录new UserSession(李四)多例然后SessionManager.getInstance().add(token_2, 李四对象)。单例SessionManager只有一个但它管理着成千上万个多例UserSession。第四阶段完整梳理你的登录场景现在我们把数据库你的 SQLite和单例串起来用户输入在登录页面输入账号密码。查数据库系统去 SQLite 里查验证账号密码对不对。验证成功假设查到了张三。注入数据系统调用单例把张三的名字存进去。UserSession.getInstance().setUsername(张三);如果是单机单用户或者SessionManager.getInstance().add(token, 张三对象);如果是多用户全局共享用户跳转到“个人中心”页面这个页面调用UserSession.getInstance().getUsername()拿到“张三”并显示。退出登录关键用户点击退出系统必须把单例里的数据清空UserSession.getInstance().setUsername(null);。否则下一个人登录没登录就能看到张三的数据。第五阶段一句话总结普通类每次new都造个新房子数据不互通。单例模式用private构造函数堵死new只留一个getInstance()接口。保证全局只有一栋房子所有人共用数据互通。登录中的作用数据库负责“验证身份”单例负责“在内存里记住当前是谁”。登录成功后把数据注入单例全系统任何界面都能去单例里读到这个人退出时清空。现在从头看这一遍是不是感觉逻辑顺畅了如果还有哪个点觉得跳跃你指出来我们就盯住那一点死磕
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2026年9月长宁区临期产品销毁:5种方法优缺点推荐 2026/9/30 14:59:49

2026年9月长宁区临期产品销毁:5种方法优缺点推荐

临期产品销毁后真的只能"拉黑"? 很多人, 都以为, 长宁区超市货架上, 那些到了佳食用期以后的饼干、还有牛奶, 给集中销毁了就等于完了, 其实, 合规的销毁流程, 远远不只是把东西烧掉或者埋掉, 那么简单, 在这个流程的背后头, 藏着的一条, 资源再生的完整链…

阅读更多 →
【信息科学与工程学】【测试技术】第十五篇 软硬件测试方法03 2026/9/30 14:59:42

【信息科学与工程学】【测试技术】第十五篇 软硬件测试方法03

。 S-67 软件回归测试 编号 测试类型 测试内容(领域归类) 被测试对象的详细分析 测试方法 测试内容列表和步骤和每个步骤的测试内容和策略和方法和路径 关联知识和标准 S-67 软件回归测试 软件/测试管理 被测试对象的详细分析 回归测试验证软件在代码变更(新功能…

阅读更多 →
双向链表从原理到实战:结构设计、核心操作与经典应用场景 2026/9/30 14:59:35

双向链表从原理到实战:结构设计、核心操作与经典应用场景

1. 为什么单链表不够用,需要双向链表 很多同学学到链表这一章,第一个接触的往往是单链表:一个结点里存一个数据域,再加一个 next 指针,指到下一个结点。这东西上手确实快,但用着用着就会碰到一个让人抓狂的…

阅读更多 →
金九银十|2026Java 后端八股汇总,面试高频题 + 详细解答 2026/9/30 14:59:35

金九银十|2026Java 后端八股汇总,面试高频题 + 详细解答

或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的…

阅读更多 →
Spring Boot+Vue二手交易系统毕设实战:从数据库到答辩全攻略 2026/9/30 14:59:35

Spring Boot+Vue二手交易系统毕设实战:从数据库到答辩全攻略

又到了毕业设计的季节。如果你在网上反复搜过“springboot vue 二手物品交易 boot 代码”,大概率是选题选到了这个方向,或者正被导师一句“做一个系统吧”架上了梁山。二手交易平台确实是被选得最多的毕设方向之一,原因很现实:业务…

阅读更多 →
Spring Boot 3 集成 Druid 连接池:核心配置、监控与密码加密实战 2026/9/30 14:59:28

Spring Boot 3 集成 Druid 连接池:核心配置、监控与密码加密实战

1. 连接池这个东西,为什么值得单独写一篇Spring Boot 3 已经出来一段时间了,我陆陆续续写了四篇学习笔记,从自动装配原理到 Web 开发、数据访问、日志框架,基本上把骨架搭了起来。但说实话,真正放到生产环境里跑&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉