Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式-单例模式

设计模式-单例模式

作者头像
MaybeHC
发布于 2024-04-23 11:27:44
发布于 2024-04-23 11:27:44
13600
代码可运行
举报
文章被收录于专栏:技术之路技术之路
运行总次数:0
代码可运行

学习了单例模式,自己记一下笔记,本文从一个单例模式开始进行一步一步的演进,使用c#语言,在实现上会结合C#的特性。演进过程为 单线程无参数单例模式->多线程无参数单例模式->.net特性多线程无参数单例模式->单线程有参数单例模式->多线程有参数单例模式->.net特性多线程有参数单例模式

No.1 单线程无参数单例模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class Singleton
    {
        private static Singleton instance;
        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }

我们以一个最简单的单例模式起手,单例模式顾名思义就是要让该类只有一个初始化的对象,首先我们需要做的是将对象的构造方法进行私有化,这样改对象就不能在外部进行实例化new,从下图可以看到当我们进行private私有化之后,在外部已经不能访问了。

在这里插入图片描述
在这里插入图片描述

下面我们在该函数内部进行实例化,进行判空如果对象没有被实例化就进行示例化,该单例模式只试用与单线程使用。为什么只能在单线程中使用?我们可以看到在每次调用Instance的时候都会进行执行if (instance == null)进行判空,但是当在多线程的时候,有可能两个线程同时满足该条件,例如:在第一个线程判断为空后,还没有进行实例化,这时候第二个线程进行了判空,将进入该语句,这样的情况就会进行两次实例化。下面我们修改这个方法让多线程可以安全使用

No.2 多线程无参数单例模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class Singleton
    {
        private static volatile Singleton instance;
        private static object lockHelper = new object();
        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

这是一个可以多线程使用的单例模式,进行了加锁,并进行了两次判断。private static object lockHelper = new object(); 这里可以任意写一个对象,只是用于加锁使用。

No.3 .net特性多线程无参数单例模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class Singleton
    {
        public static readonly Singleton Instance = new Singleton();
        private Singleton() { }
    }

这段代码可以说是非常精简,可以扩展下看着更清晰

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class Singleton
    {
        public static readonly Singleton Instance;
        static Singleton()
        {
            Instance = new Singleton();
        }
        private Singleton() { }
    }

在第一种方式中我们使用了内联初始化,在.net中会将初始化内容放入构造器中初始化,因为是静态变量所以为静态初始化器所以如下面的代码。 静态初始化器执行时期:在静态字段初始化之前进行初始化,如Singleton类就是当调用Instance时会进行初始化 我们用下面的代码测试一下执行时机:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void Main(string[] args)
        {
            Console.WriteLine("---------");
            Singleton t1 = null;
            Console.WriteLine("---------");
            Singleton t2 = Singleton.Instance;
            Console.WriteLine("---------");
            Singleton t3 = Singleton.Instance;
            Console.ReadKey();
        }
        class Singleton
        {
        	public static readonly Singleton Instance;
        	static Singleton()
        	{
            	Console.WriteLine("静态构造器初始化");
            	Instance = new Singleton();
        	}
        	private Singleton() { }
    }

执行结果:

在这里插入图片描述
在这里插入图片描述

我们可以看到在第一次调用Instance时才会发生初始化,这样就是一个基于.net特性的单例模式。

No.4 有参数单例模式

有参数的单例模式我这里就不再详细讲解,给大家贴上代码供参考 单线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //单线程
    public class Singleton
    {
        int x;
        int y;
        private static Singleton instance;
        private Singleton(int x,int y)
        {
            this.x = x;
            this.y = y;
        }
        public static Singleton GetInstance(int x, int y)
        {

            if (instance == null)
            { 
                instance = new Singleton(x, y);
            }
            else
            {
                instance.x = x;
                instance.y = y;
            }
                return instance;
            
        }
    }

多线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//多线程
    public class Singleton
    {
        int x;
        int y;
        private static volatile Singleton instance;
        private static object lockHelper = new object();
        private Singleton(int x,int y) {
            this.x = x;
            this.y = y;
        }
        public static Singleton GetInstance(int x,int y)
        {

            if (instance == null)
            { 
                lock (lockHelper)
                { 
                    if (instance == null)
                    {
                        instance = new Singleton(x,y);
                    }
                    else
                    {
                        instance.x = x;
                        instance.y = y;
                    }
                }
            }
            return instance;
            
        }
    }

.ne特性的代码,大家直接声明字段然后赋值就可以了,这里就不示范了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Sington(单例模式)
一、使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性、以及良好的效率。 大多数类用的是常规的构造器,所以往往
郑小超.
2018/01/24
8320
Sington(单例模式)
设计模式之一(单例模式)
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
aehyok
2018/09/11
7550
设计模式之一(单例模式)
Head First设计模式——单例模式
单例模式是所有设计模式中最简单的模式,也是我们平常经常用到的,单例模式通常被我们应用于线程池、缓存操作、队列操作等等。
SpringSun
2020/08/11
2690
Head First设计模式——单例模式
设计模式—单例模式
例如在Java开发中,我们都知道类和对象实例可以通过new来创建一个或者多个,而单例模式就是采取一定的办法保证整个系统中某一个类只能存在唯一一个对象实例,并且获取该类实例的方法只能是该类自己提供的一个获取其实例的静态方法。
炒香菇的书呆子
2022/04/18
3480
设计模式 ☞ 创新型模式之单例模式
  单例(Singleton)模式的定义:是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。单例模式在现实生活中的应用也非常广泛,例如,早上进公司一看,呵!这不是部门经理嘛,还是那个味,还是昨天那个人,妥妥的单例。
Demo_Null
2020/12/25
3900
一起学习设计模式--01.单例模式
单例模式是创建型模式的一种,是创建型模式中最简单的设计模式 用于创建那些在软件系统中独一无二的对象。虽然单例模式很简单,但是它的使用频率还是很高的。
独立观察员
2022/12/06
5700
一起学习设计模式--01.单例模式
温故而知新:设计模式之单件模式(Singleton)
 1 using System;  2  3 namespace Singleton  4 {  5 class Program  6     {  7 static void Main(string[] args)  8         {  9             Singleton s1 = Singleton.Instance; 10             Singleton s2 = Singleton.Instance; 11 12             Console.Writ
菩提树下的杨过
2018/01/22
6350
温故而知新:设计模式之单件模式(Singleton)
搞懂设计模式-单例模式
单例模式在网上已经是被写烂的一种设计模式了,笔者也看了不少的有关单例模式的文章,但是在实际生产中使用的并不是很多,如果一个知识点,你看过100遍,但是一次也没实践过,那么它终究不是属于你的。因此我借助这篇文章来复习下设计模式中的单例模式。
全栈程序员站长
2022/06/29
6720
阅读源码学设计模式-单例模式
现在.NETcore 默认提供了DI功能,那我想设计一个全局的引擎类,进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一,其他地方不能进行实例化。那单例模式就派上用场了。单例模式官方定义:
李明成
2020/02/12
5370
【愚公系列】2021年12月 二十三种设计模式(五)-单例模式(Singleton Pattern)
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
愚公搬代码
2022/12/01
2380
【愚公系列】2021年12月 二十三种设计模式(五)-单例模式(Singleton Pattern)
【云+社区年度征文】设计模式-单例模式(五种实现方法详解)
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
唔仄lo咚锵
2020/11/27
4000
设计模式—单例模式
对于常用的23种设计模式,这里笔者会根据自己学习和出现频率、重要程度进行学习记录吧。并且每种设计模式可能会根据暂时需求侧重学习深浅。
bigsai
2020/03/20
2700
设计模式—单例模式
设计模式- 单例模式(Singleton Pattern)
定义(单例模式又称单件模式) 单件模式(Singleton Pattern)要求一个类有且仅有一个实例,并且提供了一个全局的访问点,在同一时刻只能被一个线程所访问。 单件类只能有一个实例。 单件类必须自身创建唯一实例。 单件类必须给所有其它对象提供唯一实例。 C#例子 /// <summary> /// 单件模式实现方式:简单线程安全。 /// </summary> public sealed class Singletion { //私有构造函
易兒善
2019/05/10
6320
23设计模式之 --------- 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
默 语
2024/11/20
870
23设计模式之 --------- 单例模式
设计模式 (3) : 单例模式的几种方法
原理: c# 中用 new 方法创建一个实例需要调用类的构造函数(注: 每一个类都必须有至少一个构造函数, 当我们未定义构造函数时,编译时编译器会帮我们生成一个公有的无参数的构造函数。), 当构造函数私有(private) 时,在类外部无法创建创建类的实例。
用户2434869
2018/09/12
4120
设计模式之单例模式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/03
3770
02、人人都会设计模式--单例模式
一个男人只能有一个媳妇「正常情况」,一个人只能有一张嘴,通常一个公司只有一个 CEO ,一个狼群中只有一个狼王等等
TigerChain
2019/07/22
5160
02、人人都会设计模式--单例模式
设计模式——单例模式
设计模式——单例模式
Java架构师必看
2021/05/14
2270
设计模式——单例模式
1,单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
wfaceboss
2019/04/08
3470
Java设计模式(一)-单例模式
单例模式(Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
joshua317
2021/11/24
8200
Java设计模式(一)-单例模式
相关推荐
Sington(单例模式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验