6.常用单例模式而非静态类的原因

  1. 6.常用单例模式而非静态类的原因
    1. 6.1 题目
    2. 6.2 深入解析
    3. 6.3 答题示例
    4. 6.4 关键词联想

6.常用单例模式而非静态类的原因


6.1 题目

为什么我们使用单例模式更多,而几乎不使用静态类?


6.2 深入解析

  1. 单例模式允许延迟实例化对象

    单例模式通过懒加载(lazy initialization)来创建实例对象,即只有在第一次需要使用时才进行实例化。这可以减少资源消耗,尤其是在创建实例代价较高或应用程序启动时不需要立即使用的情况下。

    public class Singleton
    {
        private static Singleton instance;
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
    
  2. 单例模式是普通类,可配合接口与多态扩展

    C# 的 static class 不能被继承;单例实现通常是普通类,可实现接口、便于替换与测试。若真要派生子类,经典 Instance 返回基类单例时无法直接多态成子类,工程上更常见的是「单例 + 接口」或泛型单例约束,而不是简单 Derived : Singleton 了事。

    // 更稳妥的表述:单例类实现接口,便于 Mock 或替换实现
    public interface IAudioService { void Play(string clip); }
    public sealed class AudioService : IAudioService
    {
        public static readonly AudioService Instance = new AudioService();
        private AudioService() { }
        public void Play(string clip) { /* ... */ }
    }
    
  3. 单例模式的可测试性更好

    单例模式可以实现接口,使得在单元测试中可以通过依赖注入来模拟或替换实例,从而提高测试的灵活性。静态类由于其固有的静态特性,在测试过程中较难模拟和替换。

    public interface ISingleton
    {
        void SomeFunctionality();
    }
    
    public class Singleton : ISingleton
    {
        private static Singleton instance;
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    
        public void SomeFunctionality()
        {
            // 功能实现
        }
    }
    

总的来说,单例模式提供了更多的灵活性和扩展性,这些特性使得它在复杂应用程序开发中更具优势,因而被广泛使用。


6.3 答题示例

“相较于静态类,单例模式更常用的原因主要有:

  1. 延迟初始化——实例只有在第一次访问时创建,避免启动时不必要的开销;
  2. 可继承可扩展——单例是普通类,可通过继承多态扩展功能;
  3. 易于测试——实现接口后可通过依赖注入或 Mock 框架替换,静态类难以模拟;
  4. 状态管理——单例可维护内部状态,且在清理或重置时更灵活;
  5. 生命周期控制——可在程序结束或场景切换时手动销毁或重置实例。”

6.4 关键词联想

  • 单例(Singleton)
  • 延迟加载(Lazy Initialization)
  • 继承与多态
  • 依赖注入(DI)
  • 单元测试(Unit Test)
  • 状态管理
  • 生命周期控制


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏