C# 单例模式的多种实现

news/2024/11/7 8:02:08/文章来源:https://www.cnblogs.com/Can-daydayup/p/18531236

单例模式介绍

单例模式是一种创建型设计模式,它主要确保在一个类只有一个实例,并提供一个全局访问点来获取该实例。在C#中,有多种方式实现单例模式,每种方式都有其特定的使用场景和注意事项。

设计模式的作用

  • 提高代码的可重用性:通过定义一套标准的解决方案,设计模式使得相同或类似的问题可以在不同的项目中复用相同的代码结构或逻辑。
  • 增强代码的可读性:设计模式使用清晰、简洁的方式表达复杂的代码逻辑,使得其他开发者能够更容易地理解和维护代码。
  • 提高系统的可维护性:设计模式遵循一定的设计原则,如开闭原则、里氏代换原则等,这些原则有助于降低系统各部分的耦合度,提高系统的可扩展性和可维护性。

饿汉式单例模式

饿汉式单例是在类加载时就创建实例。优点是实现简单,缺点是如果该实例不被使用会造成资源浪费。

        /// <summary>
        /// 饿汉式单例模式
        /// </summary>
        public class SingletonEager
        {
            private SingletonEager() { }

            private static readonly SingletonEager _instance = new SingletonEager();

            public static SingletonEager Instance
            {
                get { return _instance; }
            }

            public void DoSomething()
            {
                Console.WriteLine("饿汉式单例模式.");
            }
        }

懒汉式单例模式

懒汉式单例在第一次被访问时才创建实例。为了线程安全,通常需要使用锁机制。

        /// <summary>
        /// 懒汉式单例模式
        /// </summary>
        public class SingletonLazy
        {
            private SingletonLazy() { }

            private static SingletonLazy? _instance;

            private static readonly object _lockObj = new object();

            public static SingletonLazy Instance
            {
                get
                {
                    if (_instance == null)
                    {
                        lock (_lockObj)
                        {
                            if (_instance == null)
                            {
                                _instance = new SingletonLazy();
                            }
                        }
                    }
                    return _instance;
                }
            }

            public void DoSomething()
            {
                Console.WriteLine("懒汉式单例模式.");
            }
        }

懒加载单例模式

如果您使用的是 .NET 4(或更高版本),可以使用Lazy类来实现线程安全的懒加载单例模式。

        /// <summary>
        /// 懒加载单例模式
        /// </summary>
        public sealed class SingletonByLazy
        {
            private static readonly Lazy<SingletonByLazy> _lazy = new Lazy<SingletonByLazy>(() => new SingletonByLazy());

            public static SingletonByLazy Instance { get { return _lazy.Value; } }

            private SingletonByLazy() { }

            public void DoSomething()
            {
                Console.WriteLine("懒加载单例模式.");
            }
        }

设计模式入门实战教程

https://mp.weixin.qq.com/s/FM0ThUR92EcXJ3YY313ifw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828143.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

F5 BIG-IP Next SSL Orchestrator 20.3.0 发布下载,新增功能介绍

F5 BIG-IP Next SSL Orchestrator 20.3.0 发布下载,新增功能介绍F5 BIG-IP Next 20.3.0 - 多云安全和应用交付 BIG-IP 是硬件平台和软件解决方案的集合,提供专注于安全性、可靠性和性能的服务 请访问原文链接:https://sysin.org/blog/f5-big-ip-next/ 查看最新版。原创作品,…

2024-11--6

DQL语句 分组查询排序查询分页查询dql语句执行顺序

读数据工程之道:设计和构建健壮的数据系统30机器学习

机器学习1. 机器学习 1.1. 机器学习正在变得普遍1.1.1. 机器学习、数据科学、数据工程以及机器学习工程的界限正在变得模糊,并且在各个组织内部都形态各异1.2. 现状1.2.1. 某些组织中,机器学习工程师负责处理为机器学习应用程序处理收集到的数据,有时甚至会形成独立且平行工…

【网络知识系列】抓包带你深入了解网关到底起什么样的作用?不同网段通信的过程详解

以下文章来源于网络之路博客 ,作者网络之路作者一天 不同网段通信的过程 不同网段就分两种了,同一个局域网下面,不同网段之间的通信,或者是从局域网去往互联网的通信,那么这个过程又是怎么样的呢?还记得第二篇这个内容吗,访问者把数据交给网关,当时候是没有讲解这个里面…

数据结构__链表_单链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

一、链表的原理与应用 对于顺序表的数据增加和删除是比较麻烦,因为都需要移动一片连续的内存。 顺序表的优点是:由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。 顺序表的缺点是:顺序表的数据在进行…

【java开发】gitee变成maven私库

原创 晓华WarmFlow warm-flow工作流1、背景 当由于各种原因,比如网络、想控制谁有权限访问类库或者公司没有服务器作为私库等,可以采用此法。 2、Gitee建新的仓库 我的仓库地址:https://gitee.com/min290/warm-flow-repo.git 2.1 首先要建立仓库2.2 仓库选择开源,否则无法下…

【Proxychains】详解

原创 无问之路 巢安实验室免责声明 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。简介 ProxyChains是Linux和其他Unix下的代理工具。它可以使任何程序通过代理上网, 允许TCP和DNS通过代理隧道。Pro…

[hgame 2023]vm

--这是我的第一个博客--如有错误希望大佬能指出---进来之后看到第8行和第12行有不知道的函数,分别是sub_140001000,sub_1400010B0。 进入第8行的sub_140001000看看。再进入sub_140001060。会发现初始化了一些以a1为基地址的数据。 vm逆向,即虚拟机逆向。这里的虚拟机类似jav…

【windows应用】命令行禁用、启用Windows系统代理

原创 hyang0 生有可恋Windows 系统代理可以通过窗口鼠标点击开关进行配置,当需要频繁切换代理和非代理状态时命令行操作会更方便。系统代理是通过注册表进行控制的,可以通过操作注册表项来控制系统代理的禁用或启用: # 禁用: reg add "HKEY_CURRENT_USER\SOFTWARE\Mic…

【红队】dump RDP凭据

免责声明: 由于传播、利用本公众号文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责管理员通常使用远程桌面协议 (RDP) 来远程管理 Windows 环境。在充当跳板机以使用户能够访问其他网络的系统中启用它也是典型的 RDP。然而,虽然这个协议在大多数…

【免杀】DLL 侧载

一、什么是 DLL?二、什么是 DLL 劫持?三、DLL 路径搜索顺序四、DLL 劫持原理五、DLL Sideloading六、什么是 DLL 代理?七、执行 DLL 代理八、武器化 DLL 代理案例1:Teams案例2:Obsidian九、结论原创 独眼情报哎,犯病了,又整这种没人看的技术长文!但是看到很好的技术文章…