设计模式 - 单例模式 Singleton Pattern - C#
单例模式 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#的更多相关文章
- 浅谈设计模式--单例模式(Singleton Pattern)
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
- 设计模式之单例模式(Singleton Pattern)
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...
- 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性
模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...
- 【设计模式】单例模式 Singleton Pattern
通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance) 的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...
- 二十四种设计模式:单例模式(Singleton Pattern)
单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- 十次艳遇单例设计模式(Singleton Pattern)
1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
随机推荐
- c#笔记(四)——switch
---恢复内容开始--- using UnityEngine; using System.Collections; public class Script1 : MonoBehaviour { ...
- 在集群上运行Spark应用
初识Spark真的存在很多疑问:Spark需要部署在集群里的每个节点上吗?Spark怎么有这么多依赖,这些依赖分别又有什么用?官网里边demo是用sbt构建的,难道还有再学一下sbt吗? --就是这么 ...
- linux 查看product_uuid,即主板id,机器识别码,需要root权限
1. 用命令 sudo dmidecode | grep UUID 或者 sudo lshw | grep uuid 2. 直接查看文件描述 sudo cat /sys/class/dmi/id/ ...
- ElementUI实现手动上传
在做项目中,与同事遇到问题,顺手记录一下 <template> <div class="common-layout"> <el-button size ...
- Django+VUE.js实现图片上传
vue里的代码 <template> <div> 添加商品<input v-model="name"><br> 价格<inpu ...
- pgsql表结构复制
CREATE TABLE pavement_damage_dtl_temp(like pavement_damage_dtl); 搜索 复制
- 【mysql练习】转置,总计,分组
1,有如下一个表,要求把这个表按照2016,2017,2018,2019,把从1月到12月的金额展示出来. profit表: year month amount2019 1 52019 3 62018 ...
- PWM脉宽调制
PWM(pulse width modulation) .由微处理器输出一系列占空比不同的矩形脉冲(单个周期相同),应用在测量,通信,功率控制与变换的许多领域.优点是从微处理器到被控系统的信号都是数字 ...
- 1.3 C语言--指针与结构体
指针 指针概念的引入 关于内存 程序有数据和指令组成,数据和指令在执行过程中存放在内存中.变量是程序数据中的一种,因此变量也存储在内存中:内存中的每个字节都有一个唯一的编码,即内存地址.32位机的内存 ...
- Leetcode本地阅读器开发--01界面设计一
返回项目声明及目录:Leetcode本地阅读器开发--总声明 整个界面设计如下:后续可能会不断优化和加入新功能 1.启动后界面 2.进行具体题目搜索 3.进行分类搜索 本节主要介绍程序界面的绘制: 1 ...