C#实现单例模式

单例模式是一种创建型设计模式,该模式保证某个类只有一个实例,并提供一个全局访问点来访问这个实例。这个模式的目的是确保该类始终都只能有一个对象被创建和访问,并且在应用程序的整个生命周期中使用这个对象。

单例模式通常用于控制资源的访问权限,例如文件系统、数据库连接等,以保证在整个应用程序中只会有一个实例被创建并被共享。

单例模式的优缺点如下:

优点:
- 保证了系统内部对象的唯一性;
- 全局统一的访问方式,便于使用和管理;
- 由于只有一个实例,因此可以节约系统资源,减少资源占用。

不完全懒汉式,但不加锁的线程安全

public sealed class Oneins
{
    private static readonly Oneins instance = new Oneins();

    /// <summary>
    /// 显式的静态构造函数用来告诉C#编译器在其内容实例化之前不要标记其类型
    /// </summary>
    static Oneins() { }

    private Oneins() { }

    public static Oneins Instance
    {
        get
        {
            return instance;
        }
    }
}

以上代码实现了单例模式的一个版本,下面是解释:

sealed 关键字用于表示该类是密封的,不能被其他的类继承。
private static readonly 关键字用于声明私有、静态和只读字段 instance ,并将其初始化为该类的唯一实例,这个实例会在程序启动时进行初始化,因此是线程安全的。
static Oneins() 是一个显式的静态构造函数,它用来告诉C#编译器在实例化之前不要标记其类型。这个构造函数在静态实例实例化前仅调用一次,即使没有使用该类方法或属性也会自动执行(因为所有的成员都是静态的)。它确保只有当你第一次使用实例时,实例才会创建。
private Oneins() 是私有的不带参数构造函数,禁止外部类实例化该类对象,从而限制本类实例化的个数为1。

最后,通过公共的 Instance 属性来获得该类的唯一实例,使用时不需要传入任何参数,只需要调用该属性即可返回类实例。这个属性实际是一个只读(getter)属性,它返回 instance 静态字段。由于 instance 字段是私有的,所以只能通过属性来访问该实例。

这是一个线程安全且简单的单例模式实现,但是它存在一个问题即无论是否被引用都会在程序启动时就初始化。如果该实例非常消耗资源,将浪费系统资源。

使用.NET 4 Lazy<T> type 特性,实现完全懒汉实例化

public sealed class Oneins
{
    private static readonly Lazy<Oneins> lazy =
           new Lazy<Oneins>(()=> new Oneins());

    public static Oneins Instance { get { return lazy.Value; } }

    private Oneins() { }
}

使用.NET 4或其以上版本,可以使用System.Lazy<T> type来实现完全懒汉式。其代码看起来也很简洁且性能表现也很好。 

posted @   多见多闻  阅读(125)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示