Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#设计模式01——单例模式的三种写法

C#设计模式01——单例模式的三种写法

作者头像
明志德道
发布于 2023-10-21 10:27:32
发布于 2023-10-21 10:27:32
78800
代码可运行
举报
运行总次数:0
代码可运行

第一种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //在方法里new  ,这里使用 双if-lock
    public  class SingleFirst
    {
        private static SingleFirst _SingleFirst;
        private static readonly object _Single_Lock = new object();
        private SingleFirst() { }
        public static SingleFirst GetInstance()
        {
            if(_SingleFirst == null)
            {
                lock (_Single_Lock)
                {
                    if(_SingleFirst == null)
                    {
                        _SingleFirst = new SingleFirst();
                    }
                }
            }
            return _SingleFirst;
        }
        
    }

第二种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /// <summary>
    /// 在构造函数里new(), 在方法返回
    /// </summary>
    public class SingleSecond
    {
        private static SingleSecond _SingleSecond = null;
        private SingleSecond() { }
        static SingleSecond()
        {
            _SingleSecond = new SingleSecond();
          
        }
        public  static  SingleSecond GetInstance()
        {
            return _SingleSecond;
        }
    }

第三种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /// <summary>
    /// 在静态字段里new(),方法里返回
    /// </summary>
    public class SingleThrid
    {
        private static SingleThrid _SingleThird = new SingleThrid();
        private SingleThrid() { }
        public static SingleThrid GetInstance()
        {
            return _SingleThird;
        }
    }

运行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                var a1 = SingleFirst.GetInstance();
                var a2 = SingleFirst.GetInstance();
                Console.WriteLine($"a1 和 a2 是同一实例:{ object.ReferenceEquals(a1, a2)}");
                ;
                var b1 = SingleSecond.GetInstance();
                var b2 = SingleSecond.GetInstance();
                Console.WriteLine($"b1 和 b2 是同一实例:{ object.ReferenceEquals(a1, a2)}");
                var c1 = SingleThrid.GetInstance();
                var c2 = SingleThrid.GetInstance();
                Console.WriteLine($"c1 和 c2 是同一实例:{ object.ReferenceEquals(a1, a2)}");

源码下载:https://gitee.com/weilong2020/csharp_23_-design-patterns.git

什么是C#单例模式?

C#单例模式是一种创建对象的设计模式,它保证一个类只有一个实例,而且它很容易被访问。在C#中,可以使用静态变量来实现单例模式,同时使用私有构造函数和公共静态方法来保证单例模式的实现。

为什么要使用C#单例模式?

C#单例模式在许多场合下是非常有用的,它可以确保一个对象实例只被创建一次,并且在整个应用程序中只有一个实例存在,这种方式可以减少资源的浪费,提高系统的性能,同时可以更方便的管理和调用实例。

单例模式应用的场景有哪些? 

单例模式可以应用于许多场合,如:

- 常用的应用场景是数据库连接的实例,因为一个系统中只需要一个数据库连接实例即可 - 系统的配置信息类,因为系统的配置信息只有一份,并且需要被全局使用 - 日志记录类,因为日志记录需要记录整个系统的运行情况,它应该被全局共享 - 缓存管理类,因为缓存数据只有一份,需要被全局共享

单例模式有哪些实现方式?

单例模式有多种实现方式,如:

- 饿汉式 - 懒汉式 - 线程安全的懒汉式 - 双重锁定 - 静态初始化

每种实现方式都有其优缺点,可以根据具体的需求来选择合适的实现方式。

如何实现一个C#单例模式?

以下是一个使用静态变量实现的C#单例模式示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

该示例中,我们使用一个私有的构造函数和一个静态变量来创建一个单例实例,然后使用一个公共的静态方法返回该实例。当第一次访问 `Instance` 属性时,会创建一个新的 `Singleton` 实例,在随后的调用中返回相同的实例。

同时,我们也可以使用线程安全的懒汉式示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton
{
    private static readonly object lockObject = new object();
    private static Singleton instance;

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

这种实现方式会把 `Instance` 属性的实现放到一个双重锁定的块中,确保只有在第一次创建实例时才会进入锁定块。这种方式可以更好地保证线程安全。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式之一(单例模式)
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
aehyok
2018/09/11
7590
设计模式之一(单例模式)
c#设计模式之单例模式
单例模式对于我们来说一点也不模式,是一个常见的名称,单例模式在程序中的实际效果就是:确保一个程序中只有一个实例,并提供一个全局访问点,节省系统资源
小小许
2020/01/15
9210
一起学习设计模式--01.单例模式
单例模式是创建型模式的一种,是创建型模式中最简单的设计模式 用于创建那些在软件系统中独一无二的对象。虽然单例模式很简单,但是它的使用频率还是很高的。
独立观察员
2022/12/06
5870
一起学习设计模式--01.单例模式
阅读源码学设计模式-单例模式
现在.NETcore 默认提供了DI功能,那我想设计一个全局的引擎类,进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一,其他地方不能进行实例化。那单例模式就派上用场了。单例模式官方定义:
李明成
2020/02/12
5460
python设计模式之单例模式
最近打算研究下设计模式,最简单最著名的创建型设计模式就数单例模式了。下面我们来一起学习一下。
用户1564362
2019/10/10
9050
python设计模式之单例模式
设计模式-单例模式
学习了单例模式,自己记一下笔记,本文从一个单例模式开始进行一步一步的演进,使用c#语言,在实现上会结合C#的特性。演进过程为 单线程无参数单例模式->多线程无参数单例模式->.net特性多线程无参数单例模式->单线程有参数单例模式->多线程有参数单例模式->.net特性多线程有参数单例模式
MaybeHC
2024/04/23
1410
设计模式-单例模式
设计模式- 单例模式(Singleton Pattern)
定义(单例模式又称单件模式) 单件模式(Singleton Pattern)要求一个类有且仅有一个实例,并且提供了一个全局的访问点,在同一时刻只能被一个线程所访问。 单件类只能有一个实例。 单件类必须自身创建唯一实例。 单件类必须给所有其它对象提供唯一实例。 C#例子 /// <summary> /// 单件模式实现方式:简单线程安全。 /// </summary> public sealed class Singletion { //私有构造函
易兒善
2019/05/10
6400
设计模式之单例
在我们平时使用中,要确保一个类只能有一个实例对象,即使多线程同时访问,也只能创建一个实例对象,并需要提供一个全局访问此实例的点。
zls365
2021/09/02
5350
设计模式之单例
设计模式的征途—1.单例(Singleton)模式
  单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛。创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。每一个创建型模式都在视图回答3个问题:3W -> 创建什么(What)、由谁创建(Who)和何时创建(When)。
Edison Zhou
2018/08/20
6780
设计模式的征途—1.单例(Singleton)模式
单例模式详解
单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保某个类只有一个实例,并提供一个全局访问点。
码事漫谈
2024/12/20
3010
单例模式详解
C#实现单例模式的几种方法
单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。通常来说,单例对象进行实例化时一般不带参数,因为如果不同的实例化请求传递的参数不同的话会导致问题的产生。(若多个请求都是传递的同样的参数的话,工厂模式更应该被考虑)
zls365
2021/01/28
3.6K0
【设计模式自习室】透彻理解单例模式
对于系统中的某些类来说,只有一个实例很重要。比如大家熟悉的Spring框架中,Controller和Service都默认是单例模式。
Rude3Knife的公众号
2019/12/31
4460
【设计模式自习室】透彻理解单例模式
Sington(单例模式)
一、使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性、以及良好的效率。 大多数类用的是常规的构造器,所以往往
郑小超.
2018/01/24
8370
Sington(单例模式)
C# 程序开发:设计模式之单例模式
1、定义:单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。
用户4831957
2019/07/02
5940
C#设计模式学习笔记-单例模式
  最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记。
跟着阿笨一起玩NET
2018/09/18
5220
单例模式 java 三种写法_双重锁的单例模式
单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全
全栈程序员站长
2022/09/22
5260
重温设计模式 --- 单例模式
单例模式是一种创建型设计模式,它的主要目的是确保某个类在应用程序中只有一个实例,并且这个实例能够被全局访问。在许多情况下,单例模式是非常有用的,比如说当你需要创建一个全局的配置类或者日志类时,单例模式可以让你轻松地实现这些功能。
Niuery Diary
2023/10/22
1390
重温设计模式 --- 单例模式
C#设计模式02——原型模式的写法
 源码下载:https://gitee.com/weilong2020/csharp_23_-design-patterns.git
明志德道
2023/10/21
1190
C#设计模式02——原型模式的写法
【愚公系列】2021年12月 二十三种设计模式(五)-单例模式(Singleton Pattern)
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
愚公搬代码
2022/12/01
2430
【愚公系列】2021年12月 二十三种设计模式(五)-单例模式(Singleton Pattern)
1,单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
wfaceboss
2019/04/08
3510
相关推荐
设计模式之一(单例模式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验