news 2026/4/3 5:02:50

测试开发面试题:单例的设计模式和应用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
测试开发面试题:单例的设计模式和应用场景

单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于管理资源、配置或全局状态,例如数据库连接池、缓存和日志记录器。

解决的问题

单例模式解决以下问题:

  • 确保只有一个实例:单例模式保证在整个应用程序中只有一个实例,避免了资源浪费和数据不一致。

  • 提供全局访问点:单例模式提供一个全局访问点,方便访问该实例,而不需要每次都重新创建。

  • 控制实例的创建和销毁:单例模式可以控制实例的创建和销毁,例如在应用程序启动时创建实例,在应用程序关闭时销毁实例。

代码实现

以下是用 Python 代码实现单例模式的一个例子:

  1. class Singleton:

  2. _instance = None

  3. def __new__(cls, *args, **kwargs):

  4. if not cls._instance:

  5. cls._instance = super().__new__(cls, *args, **kwargs)

  6. return cls._instance

  7. # 测试逻辑

  8. if __name__ == "__main__":

  9. # 创建两个实例

  10. obj1 = Singleton()

  11. obj2 = Singleton()

  12. # 判断是否为同一实例

  13. print(obj1 is obj2) # 应该输出 True

执行结果:

True

代码思路
  1. 定义一个类Singleton,其中包含一个类变量_instance,用于存储类的唯一实例。

  2. __new__方法中,首先检查类变量_instance是否为None。如果_instance为空,说明尚未创建实例,则调用父类的__new__方法创建一个新的实例,并将其赋值给_instance。如果_instance不为空,说明已经存在实例,直接返回_instance

  3. 在测试逻辑中,创建了两个Singleton的实例obj1obj2

  4. 由于单例模式的特性,obj1obj2应该是同一个实例,所以通过obj1 is obj2来判断它们是否相同。因为它们共享相同的_instance,所以输出结果应该为True

所以,整个代码的实现思路就是通过在__new__方法中控制实例的创建,确保每次创建实例时都返回同一个实例,从而实现了单例模式。

单例模式应用场景

  • 资源管理:例如数据库连接池、缓存和日志记录器。

  • 配置管理:例如应用程序的配置文件。

  • 全局状态管理:例如当前登录的用户、应用程序的当前状态。

代码演示

以下是如何使用单例模式来管理数据库连接池的示例:

  1. class DatabaseConnectionPool(Singleton):

  2. def __init__(self):

  3. super().__init__()

  4. self.connections = []

  5. def get_connection(self):

  6. if len(self.connections) == 0:

  7. # 创建新的连接

  8. connection = ...

  9. self.connections.append(connection)

  10. else:

  11. # 从连接池中获取连接

  12. connection = self.connections.pop()

  13. return connection

  14. def release_connection(self, connection):

  15. # 将连接放回连接池

  16. self.connections.append(connection)

  17. # 使用数据库连接池

  18. connection_pool = DatabaseConnectionPool()

  19. connection = connection_pool.get_connection()

  20. # 使用连接

  21. ...

  22. connection_pool.release_connection(connection)

这段代码定义了一个 DatabaseConnectionPool 类,它继承自 Singleton 类,意味着 DatabaseConnectionPool 类是一个单例类,即整个程序中只会存在一个 DatabaseConnectionPool 的实例。

代码含义:

  1. DatabaseConnectionPool类的__init__方法初始化连接池对象,并初始化一个空列表self.connections用于存储数据库连接。

  2. get_connection方法用于获取数据库连接。它首先检查连接池中是否有可用连接。如果连接池中没有连接,则创建一个新的连接,并将其添加到连接池中;如果连接池中有连接,则从连接池中取出一个连接并返回。

  3. release_connection方法用于释放数据库连接。当连接不再使用时,可以调用这个方法将连接放回连接池中,以便其他代码可以再次使用它。

  4. 在程序中,首先创建了一个DatabaseConnectionPool的实例connection_pool。然后,通过调用connection_pool.get_connection()方法,从连接池中获取一个数据库连接,并将其赋值给connection变量。

  5. 在使用连接后,调用connection_pool.release_connection(connection)方法,将连接放回连接池中,以便其他代码可以再次使用它。

总的来说,这段代码实现了一个简单的数据库连接池,通过单例模式确保了整个程序中只有一个连接池对象,而不会创建多个连接池对象。通过get_connection方法获取连接,通过release_connection方法释放连接,从而实现了连接的复用和管理。

总结

单例模式是一种常用的设计模式,它可以确保只有一个实例,并提供一个全局访问点。单例模式可以应用于各种场景,例如资源管理、配置管理和全局状态管理。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 0:35:39

推土机远程智慧运维系统方案

背景与需求随着基础设施建设的不断推进,各类大型工程项目(如道路建设、土地平整、矿山开采等)对推土机的需求日益增长。推土机作为重要的土方工程机械,其作业环境复杂多变,分布范围广泛,常常面临“多点分散…

作者头像 李华
网站建设 2026/3/31 17:10:31

VoxCPM语音合成技术深度解析:从技术突破到商业应用

VoxCPM语音合成技术深度解析:从技术突破到商业应用 【免费下载链接】VoxCPM-0.5B 项目地址: https://ai.gitcode.com/OpenBMB/VoxCPM-0.5B 您是否曾为寻找一款既专业又易用的语音合成工具而苦恼?🤔 在当今内容爆炸的时代,…

作者头像 李华
网站建设 2026/4/1 19:53:58

Maddy邮件服务器终极配置指南:轻松搭建专业邮件系统

Maddy邮件服务器终极配置指南:轻松搭建专业邮件系统 【免费下载链接】maddy ✉️ Composable all-in-one mail server. 项目地址: https://gitcode.com/gh_mirrors/ma/maddy Maddy是一款现代化的可组合邮件服务器解决方案,它将SMTP、IMAP和认证功…

作者头像 李华
网站建设 2026/3/7 14:24:43

震惊!这家外卖小程序生产商竟让同行集体沉默

震惊!这家外卖小程序生产商竟让同行集体沉默在竞争激烈的外卖市场,技术实力往往决定着商家的生死存亡。最近,一家名为妙铺的外卖小程序生产商凭借其卓越的产品性能和创新功能,在行业内引起了巨大反响,让众多同行不得不…

作者头像 李华
网站建设 2026/4/3 2:46:46

分布计算系统

文章目录**第1章 绪论****第2章 进程通信****第3章 命名与保护****第4章 同步和互斥****第5章 分布式系统中的死锁****第6章 分布式系统中的容错技术****第7章 分布式数据管理****第8章 分布式文件系统****第9章 分布式调度****第10章 分布式共享存储器 (DSM)****总结**这是一个…

作者头像 李华