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

TypeScript中该类实现属于何种设计模式?Instance方法有何优势?

问题

我在查看一个TypeScript仓库时,发现所有类均采用如下方式实现:

export class ServiceClass {
  private static instance: ServiceClass;

  private constructor() {}

  public static Instance(): ServiceClass {
    if (!ServiceClass.instance) {
      ServiceClass.instance = new ServiceClass();
    }
    return ServiceClass.instance;
  }

  // public static ServiceMethod1

  // public static ServiceMethod2

  // public static ServiceMethod3
}

此类的方法使用方式为new ServiceClass.Instance().ServiceMethod1()。请问拥有Instance()方法有哪些额外优势?与仅在类中包含服务方法、通过const obj = new ServiceClass(); obj.ServiceMethod1();调用的方式有何区别?这属于某种设计模式吗?

回答

这属于什么设计模式?

这是**单例模式(Singleton Pattern)**的典型实现,核心就是保证一个类在程序运行全程只有一个实例,同时提供全局的访问入口。

Instance()方法的额外优势

  • 全局唯一实例:不管调用多少次Instance(),返回的都是同一个对象,完全避免了重复创建实例带来的资源浪费,特别适合配置管理、日志服务这类不需要多实例的场景。
  • 延迟初始化:只有第一次调用Instance()时才会创建实例,而不是类加载时就初始化,能有效降低程序启动时的资源占用。
  • 可控的实例创建:可以在Instance()里加额外逻辑,比如初始化前的参数校验、依赖注入,后续如果要调整实例创建规则(比如临时改成多实例),也不用改外部调用代码,灵活性拉满。
  • 防止随意实例化:构造函数是private的,外部根本没法直接用new ServiceClass()创建实例,从根源上杜绝了多实例的可能。

与普通实例化调用的区别

  • 实例数量:普通方式每次new都会生成新实例,如果服务类需要共享状态(比如缓存数据),普通方式会导致状态分散;单例模式则能保证全程序状态一致。
  • 资源消耗:频繁创建销毁实例会增加内存开销和GC压力,单例只初始化一次,效率更高。
  • 访问成本:单例通过ServiceClass.Instance()就能全局访问,不用自己保存实例引用;普通方式需要手动管理实例对象,一不小心就会出现多个引用指向不同实例的问题。
  • 初始化时机:普通实例在new的时候立刻初始化,单例是第一次调用Instance()才初始化,延迟加载更适合资源密集型服务。

另外注意:你提到的new ServiceClass.Instance().ServiceMethod1()是错误调用方式,Instance()本身已经返回了类的实例,正确用法应该是ServiceClass.Instance().ServiceMethod1()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:07:22