SingletonPattern-单例模式

在C#中,单例模式(Singleton Pattern)用于单例模式常用于需要限制某个类只能创建一个对象的场景,例如数据库连接、日志记录器等。

  1. 懒汉式(Lazy Initialization)

    这种实现方式使用了双重检查锁定(双IF加锁),即在获取实例前先检查实例是否已经存在,如果不存在再使用锁进行同步。这种方式延迟了实例的创建,只有在需要使用实例时才会进行创建。该实现是线程安全的,并且能够在多线程环境下保证只有一个实例。

    public class Singleton
    {
        private static Singleton instance;
        private static readonly object lockObj = new object();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObj)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
  2. 饿汉式(Eager Initialization)
    这种实现方式在类加载时就创建了实例,所以称为饿汉式。在多线程环境下也能保证只有一个实例,但可能会在程序启动时就创建实例,有一定的内存开销。
    public class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get { return instance; }
        }
    }
  3. 静态构造函数(Static Constructor)
    这种实现方式利用了C#的静态构造函数,在第一次使用Singleton类时执行静态构造函数并创建实例。它也能保证在多线程环境下只有一个实例。
    public class Singleton
    {
        private static readonly Singleton instance;
    
        private Singleton() { }
    
        static Singleton()
        {
            instance = new Singleton();
        }
    
        public static Singleton Instance
        {
            get { return instance; }
        }
    }
  4. 使用.NET的Lazy<T>类型实现:
    这种方式利用了Lazy<T>类型的延迟加载特性,确保只有在需要时才创建实例。
    public class Singleton
    {
        private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton());
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get { return lazyInstance.Value; }
        }
    }

 

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式具有以下优点和缺点:

优点:

  1. 单一实例:单例模式确保一个类只有一个实例存在,这样可以节省系统资源,避免重复创建相同对象,在一些情况下可以提高性能。

  2. 全局访问点:通过单例模式,可以提供一个全局的访问点来访问单例实例。这样可以方便地从任何地方获取该实例,简化了对象的使用和调用。

  3. 控制对象的创建:单例模式可以控制对象的创建过程,避免其他代码中随意创建该类的实例。这样可以提高对对象的管理和控制,确保对象的唯一性。

  4. 延迟实例化:单例模式可以延迟对象的实例化,只有在需要的时候才创建实例。这样可以避免在程序启动时就创建大量的对象,提升了程序的启动速度。

缺点:

  1. 难以扩展:由于单例模式只允许存在一个实例,如果需要扩展功能或创建不同类型的实例,可能需要修改单例类的代码。这可能违背了开放封闭原则,造成代码的不稳定性。

  2. 全局状态:由于单例模式提供了全局访问点,可能会导致全局状态的存在。多个代码段可能都依赖同一个单例实例,对单例实例的状态的修改可能会影响其他代码段的行为,增加了代码的耦合性。

  3. 难以进行单元测试:由于单例模式的全局性质,可能会对单元测试造成不便。对于依赖于单例实例的代码,可能需要特殊的处理和配置,以保证单元测试的可行性。

需要根据具体的应用场景和需求来评估使用单例模式的利弊。单例模式适用于需要确保全局只存在一个实例,并提供全局访问点的情况。通过权衡其优点和缺点,可以选择是否使用单例模式。

posted @ 2023-08-02 16:03  ZHIZRL  阅读(21)  评论(0编辑  收藏  举报