C#设计模式01——单例模式的三种写法
第一种
//在方法里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——单例模式的三种写法的更多相关文章
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- Android设计模式之单例模式的七种写法
一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...
- C#单例模式的三种写法
第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{ private static Singleton ...
- 设计模式之单例模式的几种写法——java
对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...
- C#单例模式的三种写法 以及 继承面试题
1.没有考虑线程安全 public class Singleton { private static Singleton _instance = null; private Singleton(){} ...
- 单例模式的N种写法
单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何 ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- HTML颜色的三种写法
颜色的三种写法: 1.16进制代码 #000000 2.英文字母 red 3.rgba rgba(0-255,0,0,0-1) 例如: <b ...
- Java 单例模式的七种写法
Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...
随机推荐
- [ABC274Ex] XOR Sum of Arrays
section> Problem Statement For sequences $B=(B_1,B_2,\dots,B_M)$ and $C=(C_1,C_2,\dots,C_M)$, eac ...
- C++学习笔记五:变量与数据类型(Auto类型)
Auto 允许编译器自己来推断变量的类型,这种新功能是在c++11引入的.这个关键字结合for循环使用可以节省变量类型的重复输入.VS Code可以在鼠标移动到变量上之后直接显示变量的类型. auto ...
- flask上下文、g变量、current_app
在flask中的上下文分为两种 : 请求上下文 (request context) 也就是和请求相关的上下文,记录一些请求相关的数据. 包含: 1.request请求对象 2.session会话 应用 ...
- django-filter的详细使用
有时候前端需要各种各样的过滤查询,如果自己写多少有点麻烦和冗余.使用django-filter就可以很好的解决这个问题. django-filter可以用在django上, 也与配合drf一起使用. ...
- grpc是基于http/2协议的高性能的rpc框架
师傅领进门,修行在个人,跟着官方脚手架demo了grpc后,之后就需要扩展前后知识边界,下面总结grpc的前世今生和最佳实践. https://www.cnblogs.com/JulianHuang/ ...
- 牛客刷java记录第5天
第一题,下列代码运行结果是? class X { Y y = new Y(); public X() { System.out.print("X"); } } class Y { ...
- 【OpenCV】在MacOS上使用OpenCvSharp
前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Andr ...
- vue星星评分
<template> <div> <div class="xx"> <div v-for="(i, index) in list ...
- storybook 编写stories的story基础语法
编写 stories story 用于展示组件某个状态,每个组件可以包含任意多个 story,用来测试组件的各种场景.根据默认配置,只需要在组件的文件夹中,以 **.component.stories ...
- SyntaxError: Non-ASCII character #-*- coding:utf-8 -*-
执行python报错 /usr/bin/python2.7 /root/demo.py File "/root/demo.py", line 2 SyntaxError: Non- ...