第一种

 //在方法里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. WPF 入门基础

    关于 WPF 和 XAML 什么是 WPF WPF(Windows Presentation Foundation)是由微软开发的桌面应用程序框架,用于创建现代化.高度交互和具有视觉吸引力的用户界面. ...

  2. .NET周刊【12月第2期 2023-12-13】

    国内文章 用最清爽的方式开发dotNet https://www.cnblogs.com/ncellit/p/17881779.html 本文介绍了如何以清爽的方式开发dotNet应用,特别是简单的A ...

  3. 支付宝沙箱支付-zfbsxzf

    title: 支付宝沙箱支付 date: 2022-03-03 13:55:15.281 updated: 2022-03-10 16:00:42.331 url: https://www.yby6. ...

  4. Springboot3核心特性

    一.简介 1. 前置知识 Java17 Spring.SpringMVC.MyBatis Maven.IDEA 2. 环境要求 环境&工具 版本(or later) SpringBoot 3. ...

  5. go的html模板template格式化时间

    go的html模板template格式化时间 go的html模板template格式化时间,网上一搜挺尴尬找不到想要的yyyy-MM-dd HH:mm:ss // 代码中是这样的 //2021-09- ...

  6. [Python急救站]含义GUI的学生管理系统

    这个管理系统是含有GUI界面的学生管理系统,比较方便. import tkinter as tk class Student: def __init__(self, name, student_id, ...

  7. 网络地图服务(WMS)详解

    目录 1.概述 2.GetCapabilities 3.GetMap 4.GetFeatureInfo 阅读本文之前可参考前文:<地图服务器GeoServer的安装与配置>与<Geo ...

  8. rasa train nlu详解:1.1-train_nlu()函数

      本文使用<使用ResponseSelector实现校园招聘FAQ机器人>中的例子,主要详解介绍train_nlu()函数中变量的具体值. 一.rasa/model_training.p ...

  9. CloudIDE插件在手,按时下班不愁

    摘要:带你通过插件机制将CloudIDE扩展出你想要的功能,在CloudIDE中看视频,玩游戏,聊天都可以通过我们的插件来轻松实现,让生产工具不再枯燥,开发工作多姿多彩. 距离华为云CloudIDE在 ...

  10. 带你认识三种kafka消息发送模式

    摘要:在kafka-0.8.2之后,producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率. 本文分享自华为云社区<kafka消息发送模 ...