单例模式 Singleton Pattern

1、单例模式设计模式属于创建型模式

2、是单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

3、意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

4、主要解决:一个全局使用的类频繁地创建与销毁。

方式一:双 if Lock

 1 namespace SingletonPattern
2 {
3 /*
4 * 私有化构造函数
5 * 私有化静态变量
6 * 使用一个静态的对象实例化
7 */
8 public class Singleton
9 {
10 private static Singleton? _Singleton = null;
11 private static readonly object SingletonLock = new();
12
13 //让构造函数为 private
14 private Singleton()
15 {
16 Console.WriteLine("实例化了对象");
17 }
18
19 public static Singleton CreateInstance()
20 {
21 if (_Singleton == null) //当对象不为 null 时,不需要再走 if 内的代码
22 {
23 lock (SingletonLock)
24 {
25 if (_Singleton == null) //保证对象为 null 才 new
26 {
27 _Singleton = new Singleton();
28 }
29 }
30 }
31 return _Singleton;
32 }
33
34 public void Show()
35 {
36 Console.WriteLine("{0} Show", this.GetType().Name);
37 }
38 }
39 }

方式二:静态构造函数

 1 namespace SingletonPattern
2 {
3 /*
4 * 静态构造函数方式
5 */
6 public class Singleton2
7 {
8 private static readonly Singleton2 _Singleton2;
9
10 //让构造函数为 private
11 private Singleton2()
12 {
13 Console.WriteLine("实例化了对象");
14 }
15
16 /// <summary>
17 /// 静态构造函数 由 CLR 保证在第一次使用类之前被调用
18 /// </summary>
19 static Singleton2()
20 {
21 _Singleton2 = new Singleton2();
22 }
23
24 public static Singleton2 CreateInstance()
25 {
26 return _Singleton2;
27 }
28
29 public void Show()
30 {
31 Console.WriteLine("{0} Show", this.GetType().Name);
32 }
33 }
34 }

方式三:静态变量初始化

 1 namespace SingletonPattern
2 {
3 /*
4 * 静态变量初始化方式
5 * 静态变量特点:第一次使用时初始化一次,且不会被回收
6 */
7 public class Singleton3
8 {
9 private static readonly Singleton3 _Singleton3 = new();
10
11 //让构造函数为 private
12 private Singleton3()
13 {
14 Console.WriteLine("实例化了对象");
15 }
16
17 public static Singleton3 CreateInstance()
18 {
19 return _Singleton3;
20 }
21
22 public void Show()
23 {
24 Console.WriteLine("{0} Show", this.GetType().Name);
25 }
26 }
27 }

使用:

1 Singleton singleton = Singleton.CreateInstance();
2 singleton.Show();
3
4 Singleton2 singleton2 = Singleton2.CreateInstance();
5 singleton2.Show();
6
7 Singleton3 singleton3 = Singleton3.CreateInstance();
8 singleton3.Show();

设计模式 - 单例模式 Singleton Pattern - C#的更多相关文章

  1. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  2. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  3. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  4. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  5. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  6. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  7. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  8. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  9. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  10. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

随机推荐

  1. leetcode -- 旋转矩阵相关问题

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  2. 关于什么时候用get请求和什么时候用post请求

    转载自:(19条消息) 关于什么时候用get请求和什么时候用post请求_火兰的博客-CSDN博客_什么时候用get什么时候用post get和post方法功能类似的,使用建议:1.get方式的安全性 ...

  3. ubuntu22.04 交叉编译openwrt

    国内源vi /etc/apt/sources.listdeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted un ...

  4. redis常用命令之Hash

    redis常用命令之Hash Hash常用命令 redis 可以理解为一个全局的大字典,key就是数据的唯一标识符.对应的key不同,value也不同.redis有5个基本的数据类型. 1 redis ...

  5. Github快速访问

    Github快速访问 1. 国内访问github慢     github是国外网站,用国内的网络很难访问到,也就无法使用github,作为程序猿的我们,无法使用github可太难受了,那么我们有什么办 ...

  6. MySQL索引 及 EXPLAIN

    1.索引长度计算: 1.索引字段,没有设置NOT NULL,则需要加一个字节. 2.定长字段:tinyiny占1个字节.int占4个字节.bitint占8个字节.date占3个字节.datetime占 ...

  7. 数据脱敏java代码

    //前prefix后suffix脱敏 public static String idEncrypt(String number ,Integer prefix, Integer suffix) { i ...

  8. jenkins +docker+python接口自动化之jenkins容器下安装python项目所需要的库(三)

    1.场景 1.centos系统,在docker的jenkins容器下安装python项目所需要的包 2.我们目前是搞接口自动化,代码放到码云上,运行环境是jenkins容器下,所以需要在jenkins ...

  9. Linux服务器中了挖矿木马怎么办?-挖矿木马自助清理手册

    什么是挖矿木马 挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,严重影响服务器上的其他应用的正常运行.黑客为了得到更多的算力资源,一般都会对全网进行无差别扫描,同时利用SSH爆破和漏洞 ...

  10. Mysql语句练习

    某宾馆其关系模式如下:Room(房间编号,房间类型,价格)Customer(顾客编号,顾客姓名,年龄,电话)RC(房间号,顾客编号,入住日期,入住天数) 1 create database Hotel ...