第一种

 //在方法里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. [ARC165E] Random Isolation

    Problem Statement There is a tree with $N$ vertices numbered $1$ to $N$. The $i$-th edge connects ve ...

  2. [ABC265G] 012 Inversion

    Problem Statement You are given a sequence $A=(A_1,\ldots,A_N)$ of length $N$. Each element is $0$, ...

  3. 基于 WinCC OA 构建分布式可视化平台

    ​WinCC OA 的全称是:SIMATIC WinCC Open Architecture,是西门子工业自动化品牌SIMATIC系列的一部分.专门针对客户定制大型和/或复杂的应用以及需要满足特定系统 ...

  4. 谷粒学院通用工具类R类

    import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.HashMap; import ...

  5. 使用cgroup控制CPU使用率

    关键文件 cpu子系统中的关键文件. cpu.cfs_period_us cpu.cfs_quota_us tasks cgroup.procs 常用命令 查看当前系统内的CPU. lscpu 查看当 ...

  6. CVE-2023-36025 Windows SmartScreen 安全功能绕过漏洞

    CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞.攻击者可以通过诱导用户单击特制的URL来利用该漏洞,对目标系统进行攻击.成功 ...

  7. VSCode C++开发环境配置: LLVM clang clangd

    工欲善其事,必先利其器 llvm/clang 比 VSCode 自带的代码提示功能速度更快,功能更强(支持 clang-tidy). 安装 llvm.clang sudo apt install ll ...

  8. 如何使用.NET在2.2秒内处理10亿行数据(1brc挑战)

    译者注 在上周我就关注到了在github上有1brc这样一个挑战,当时看到了由Victor Baybekov提交了.NET下最快的实现,当时计划抽时间写一篇文章解析他的代码实现,今天突然看到作者自己写 ...

  9. 什么是全场景AI计算框架MindSpore?

    摘要:MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端.边缘.云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛. MindSpo ...

  10. 使用 Zpan 搭建低成本个人私有网盘,还不限速

    摘要:本文就介绍一个不限速的低成本个人网盘--ZPan,相较于老牌的私有网盘 OwnCloud 等,Zpan 有一个独有的优势:不限速. 本文分享自华为云社区<使用 Zpan 搭建低成本个人私有 ...