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
相关产品推荐
相关产品推荐

