基础单例模式(C#举例)

本文介绍了单例模式的基本概念,以及C#中实现单例的三种常见方式:饿汉式、懒汉式和静态内部类式。单例模式用于确保类只有一个实例,适用于配置信息、连接池等场景。虽然存在一些反模式问题,如隐藏依赖和测试性差,但在特定情况下仍有其价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文主要作为一个基础的普及文章,简单介绍单例模式的三种理解,为了在看单例模式攻防这篇文章做一些简单的铺垫。

单例模式是最简单的设计模式之一,提供了一种创建唯一对象的方式,用于保证仅有单个唯一的对象访问方式,可以直接访问而不需要或避免对该类的实例化。

应用于某些需要保证唯一对象的场景,比如配置信息类、连接池类、ID生成器类、全局变量类等,接下来介绍下三种常见的单例模式写法:

饿汉式

默认直接实例化的情况比较简单直接,缺点在于类一启动就申请了内存空间,即使没有被调用,因此有了第二种懒汉式写法,即在实际使用的时候才进行实例化来申请内存。

    class Demo1
    {//author: ​suoxd123@126.com
        private Demo1() { }
        private static Demo1 demoItem = new Demo1();
        public Demo1 getInstance()
        {
            return demoItem;
        }
    }

懒汉式

懒汉式的单例保证了线程安全,也可以进行慢加载,只有在用到的时候才进行初始化和申请内存,调用效率比较高。

    class Demo2
    {//author: ​suoxd123@126.com
        private static object objLock = new object();
        private Demo2() { }
        private volatile static Demo2 demoItem;
        public static Demo2 getInstance()
        {
            if (demoItem == null)
            {
                lock (objLock)
                {
                    if (demoItem == null)
                    {
                        demoItem = new Demo2();
                    }
                }
            }
            return demoItem;
        }
    }

静态内部类式

这种写法通过在类中定义一个静态的内部类,在静态类中定义静态变量来进行访问,既保证了线程安全,也满足了慢加载。

    class Demo3
    {//author: ​suoxd123@126.com
        private Demo3() { }
        private static class InnerHelper
        {
            public static Demo3 demoItem = new Demo3();
        }
        public Demo3 getInstance()
        {
            return InnerHelper.demoItem;
        }
    }

常规理解的单例模式通常是指进程单例,即进程内实例唯一,也有一些环境需要用到线程单例,甚至集群单例,可以根据实际需要增加相关配置即可。

尽管可以通过单例模式进行唯一对象的生成,但单例模式也不是万能的,常被诟病为反模式的,还有一些其它问题比如

  1. 对面向对象的特性支持不友好
  2. 隐藏类之间的依赖
  3. 对代码扩展性不友好
  4. 可测试性不好

尽管通过private可以阻挡常规的调用的多次实例化,但是在一些极端的情况下,可能会有一定的问题,具体过程请点击查看:单例模式攻防进阶(https://www.zhenxiangsimple.com/2019/12/24/tech/design-single/)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

具身小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值