You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

getInstance()方法的作用是什么?单例实现与普通构造的差异解析

问题解答

1. getInstance() 实现的功能

这个静态方法是单例设计模式的核心实现,作用是保证整个应用运行过程中,UsersService 类只能生成唯一一个实例:

  • 首次调用时会检查类上有没有挂载已创建的实例,如果不存在就调用构造函数初始化一个新实例,挂载到UsersService.instance属性上再返回
  • 后续所有调用都会直接返回第一次创建好的实例,不会重复生成新的UsersService对象

2. 不使用第二种写法的原因

第二种是基于*依赖注入(DI)*的典型写法,通常用于Nest这类自带IOC容器的框架中,由框架统一管控实例的创建和依赖注入,不需要开发者手动处理。两种写法的适用场景完全不同:

  • 第一种单例写法不需要依赖任何IOC容器,在纯Node.js业务项目、没有集成带DI能力的框架时,也能自行保证全局实例唯一
  • 第二种写法要求开发者手动创建UsersService实例时必须传入UsersDao对象,如果没有额外的单例管控,多个业务模块重复new UsersService(dao)会生成多个互不关联的Service实例,可能出现Dao层数据库连接重复初始化、内存缓存状态不一致等问题
  • 单例写法对调用方更友好,调用方不需要关心UsersService的依赖组成,直接调用getInstance()就能拿到可用的实例,不需要自己组装依赖

3. getInstance() 的设计目标

  • 避免重复实例化带来的资源浪费:全局唯一实例意味着底层UsersDao的数据库连接、内置缓存等资源只会初始化一次,减少不必要的性能开销
  • 保证全局状态一致:所有业务模块操作的都是同一个Service实例,不会出现多实例下缓存不同步、数据重复写入这类异常问题
  • 简化实例调用逻辑:不需要在多个模块之间传递UsersService实例,也不需要高层模块感知Service的依赖结构,所有调用方都通过统一的入口拿实例,降低代码耦合度

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:15:05