第一种

 //在方法里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;
} }

第二种

    /// <summary>
/// 在构造函数里new(), 在方法返回
/// </summary>
public class SingleSecond
{
private static SingleSecond _SingleSecond = null;
private SingleSecond() { }
static SingleSecond()
{
_SingleSecond = new SingleSecond(); }
public static SingleSecond GetInstance()
{
return _SingleSecond;
}
}

第三种

    /// <summary>
/// 在静态字段里new(),方法里返回
/// </summary>
public class SingleThrid
{
private static SingleThrid _SingleThird = new SingleThrid();
private SingleThrid() { }
public static SingleThrid GetInstance()
{
return _SingleThird;
}
}

运行测试

                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#单例模式示例:

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

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

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

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

C#设计模式01——单例模式的三种写法的更多相关文章

  1. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  2. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  3. Android设计模式之单例模式的七种写法

    一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...

  4. C#单例模式的三种写法

    第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static Singleton ...

  5. 设计模式之单例模式的几种写法——java

    对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...

  6. C#单例模式的三种写法 以及 继承面试题

    1.没有考虑线程安全 public class Singleton { private static Singleton _instance = null; private Singleton(){} ...

  7. 单例模式的N种写法

    单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何 ...

  8. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  9. HTML颜色的三种写法

    颜色的三种写法: 1.16进制代码     #000000 2.英文字母         red 3.rgba                rgba(0-255,0,0,0-1) 例如: <b ...

  10. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

随机推荐

  1. 推荐给前端开发的 5 款 Chrome 扩展 🚀

    大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 工欲善其事,必先利其器.Chrome 可能是前端开发中使用最多的浏览器.在日常开发中,下列几款 Ch ...

  2. 【内核】ELF 文件执行流程

    # ELF 文件分类 Linux中,ELF文件全称为:Executable and Linkable Format,主要有三种形式,分别是: 可执行文件 动态库文件(共享文件 .so) 目标文件(可重 ...

  3. 从零玩转人脸识别验证-face

    title: 从零玩转人脸识别验证 date: 2022-05-15 21:05:52.974 updated: 2023-05-16 00:00:11.594 url: https://www.yb ...

  4. 痞子衡嵌入式:Farewell, 我的写博故事2023

    -- 题图:苏州虎丘塔 2023 年的最后一天,照旧写个年终总结.昨晚和同门师兄弟一起吃饭,有个师弟告诉痞子衡,微博上一个拥有 22.3W 粉丝的嵌入式同行今年 4 月发过一个吐槽微博,说恩智浦 MC ...

  5. python在容器内克隆拉取git私有仓库

    前言 目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用 ...

  6. k8s 标签-2

    目录 标签-2 node的角色 修改node节点的角色,将他的角色修改成他的主机名 标签的作用 Cordon,Drain以及污点 Cordon--告警警戒 Drain 驱逐演示 污点 污点的Cordo ...

  7. Java日期时间处理详解

    Java中SimpleDateFormat.LocalDateTime和DateTimeFormatter的区别及使用 在Java的世界里,处理日期和时间是常见的任务.尤其在Java 8之前,Simp ...

  8. 深入浅出Sqoop之迁移过程源码分析

    [摘要]Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具 .本文将简单介绍Sqoop作业执行时相关的类及方法,并将该过程与MapReduce的 ...

  9. Rust太难?那是你没看到这套Rust语言学习万字指南!

    摘要:从开发环境.语法.属性.内存管理和Unicode等五部分,为你带来一份详细的Rust语言学习的精华总结内容. 一.Rust开发环境指南 1.1 Rust代码执行 根据编译原理知识,编译器不是直接 ...

  10. 统一元数据,数据湖Catalog让大数据存算分离不再是问题

    摘要:为了解决现阶段大数据存算分离痛点问题,华为云大数据推出重量级数据湖Catalog服务. 1 背景 随着5G.IoT等技术的发展,企业积累了越来越多的数据,需要激发更多的数据价值变现.传统大数据平 ...