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

