创建型-单例模式-实现和优缺点

一、实现方式:

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。以下是几种实现单例模式的常见方式:

  1. 懒汉式(Lazy Initialization)

    这种方式在第一次使用时才创建单例实例,而不是在应用程序启动时就创建。这可以节省资源。

    public class Singleton
    {private static Singleton instance;private Singleton() { }public static Singleton Instance{get{if (instance == null){instance = new Singleton();}return instance;}}
    }
    

    这种实现方式在多线程环境下不是线程安全的,需要进行额外的同步措施,以避免多个线程同时创建实例。

  2. 双检锁(Double-Check)懒汉式

    这种方式在多线程环境下进行了改进,使用双检锁机制确保只有一个实例被创建。

    public class Singleton
    {private static Singleton instance;private static readonly object lockObject = new object();private Singleton() { }public static Singleton Instance{get{if (instance == null){lock (lockObject){if (instance == null){instance = new Singleton();}}}return instance;}}
    }
    

    这种方式在需要多线程支持时比第一种方式更安全,但仍然需要小心处理锁的性能开销。

  3. 饿汉式(Eager Initialization)

    这种方式在类加载时就创建了实例,因此是线程安全的。

    public class Singleton
    {private static readonly Singleton instance = new Singleton();private Singleton() { }public static Singleton Instance{get { return instance; }}
    }
    

    这种方式的缺点是,即使不使用单例对象,也会在应用程序启动时创建它,可能浪费了一些资源。

  4. 使用.NET的Lazy<T>

    C#提供了Lazy<T>类,可以用来实现延迟初始化的单例模式。它提供了线程安全的延迟初始化,并且不需要手动编写复杂的代码。

    public class Singleton
    {private static readonly Lazy<Singleton> lazyInstance =new Lazy<Singleton>(() => new Singleton());private Singleton() { }public static Singleton Instance => lazyInstance.Value;
    }
    

    这种方式结合了懒汉式和饿汉式的优点,是一种常见的实现方式。

无论使用哪种方式,单例模式的核心思想都是确保只有一个实例存在,并提供一个全局访问点来访问它。选择实现方式取决于你的需求和线程安全性要求。
 

二、优缺点:

单例模式主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。虽然单例模式在某些情况下非常有用,但它也有一些优点和缺点:

优点:

  1. 全局唯一实例:单例模式确保一个类只有一个实例存在,这对于管理全局资源或状态非常有用。

  2. 懒加载:单例模式可以延迟实例化,只有在第一次访问时才创建实例,这可以节省系统资源,特别是对于大型对象或资源密集型操作。

  3. 全局访问点:通过单例模式,你可以获得一个全局访问点来访问实例,这可以方便地管理和共享资源或状态。

  4. 线程安全:如果实现得当,单例模式可以提供线程安全的访问,确保多个线程不会同时创建多个实例。

缺点:

  1. 全局状态:单例模式引入了全局状态,这可能导致系统中的耦合问题和难以调试的 bug。因为多个部分共享相同的实例,一个部分的改变可能会影响其他部分。

  2. 隐藏依赖关系:单例模式隐藏了类之间的依赖关系,这可能使代码更难理解和维护。因为单例实例可以从任何地方访问,你可能不清楚哪些类依赖于它。

  3. 单例模式滥用:有时候,开发人员可能会滥用单例模式,将大量的功能放在一个单例类中,导致该类变得庞大和难以维护。这可能违反了单一职责原则。

  4. 测试困难:由于单例模式创建全局状态,它可能会使单元测试变得更加复杂,因为你需要确保测试之间的状态不会相互干扰。

总的来说,单例模式在某些情况下非常有用,特别是在需要确保只有一个实例存在的情况下。然而,开发人员应该谨慎使用它,以避免引入不必要的全局状态和复杂性。在应用程序开发中,依赖注入和面向接口编程等技术已经提供了更好的方法来管理对象的生命周期和依赖关系,而不仅仅是通过单例模式。因此,在使用单例模式之前,应该仔细考虑其适用性。

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

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

相关文章

RocketMQ 发送顺序消息

文章目录 顺序消息应用场景消息组&#xff08;MessageGroup&#xff09;顺序性生产的顺序性MQ 存储的顺序性消费的顺序性 rocketmq-client-java 示例&#xff08;gRPC 协议&#xff09;1. 创建 FIFO 主题生产者代码消费者代码解决办法解决后执行结果 rocketmq-client 示例&…

Hbase工作原理

Hbase&#xff1a;HBase 底层原理详解&#xff08;深度好文&#xff0c;建议收藏&#xff09; - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store&#xff0c;那么这些store在不同的region Hbase写流程&#xff08;读比写慢&#xff09; MemStore Flush Hbas…

计算机二级python简单应用题刷题笔记(一)

计算机二级python简单应用题刷题笔记&#xff08;一&#xff09; 1、词频统计&#xff1a;键盘输入一组我国高校所对应的学校类型&#xff0c;以空格分隔&#xff0c;共一行。2、找最大值、最小值、平均分&#xff1a;键盘输入小明学习的课程名称及考分等信息&#xff0c;信息间…

Python运算符、函数与模块和程序控制结构

给我家憨憨写的python教程 ——雁丘 Python运算符、函数与模块和程序控制结构 关于本专栏一 运算符1.1 位运算符1.1.1 按位取反1.1.2 按位与1.1.3 按位或1.1.4 按位异或1.1.5 左移位 1.2 关系运算符1.3 运算顺序1.4 运算方向 二 函数与模块2.1 内建函数2.2 库函数2.2.1 标准库…

css 预处理器的相关使用

css 预处理器的相关使用 sass 预处理器相关语法及使用技巧 1. 变量 定义变量&#xff1a;$变量: 属性值; 的方式定义变量 使用变量&#xff1a;$变量 $bone_fish_color: #dcdfe6;/* 使用 */ color: $bone_fish_color;2. 继承 extend 使用场景: 继承另一个选择器的代码. 使用方…

关于远程工作的面试可能存在的陷阱

附上看到的完整帖子地址&#xff1a;面试 POPER 的后端开发工程师的离奇经历 分享一下我遇到过的&#xff0c;我至少面试过10个远程工作&#xff0c;其中有3个的面试是直接让我完成一个需求的&#xff0c;前两次都耐心做了&#xff0c;第3次看到相同要求时我都懒得回复了&…

【pytest】 pytest拓展功能 PermissionError问题

目录 1. pytest-html 1.1 PermissionError: [Errno 13] Permission denied: D:\\software\\python3\\anconda3\\Lib\\site-packages\\pytest_html\\__pycache__\\tmp_ttoasov 1.2错误原因 2. 失败用例重试 3. 用例并行执行 pytest-parallel 1. pytest-html 管理员打开 A…

「聊设计模式」之建造者模式(Builder)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 设计模式是众多优秀软件开发实践的总结和提炼&#xff0c;…

【Vue】el 和 data短小精湛的细节!

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue教程持续更新哈&#xff0c;花费了大量的时间和精力&#xff0c;总结拓展了很多疑难点&#xff0c;想要学习&巩固&避坑就一起学习叭~ el 与 data 的两种写法 el共有2种写法 el表达式主要用来在模板中展示数据,它…

前端VUE---JS实现数据的模糊搜索

实现背景 因为后端实现人员列表返回&#xff0c;每次返回的数据量在100以内&#xff0c;要求前端自己进行模糊搜索 页面实现 因为是实时更新数据的&#xff0c;就不需要搜索和重置按钮了 代码 HTML <el-dialogtitle"团队人员详情":visible.sync"centerDi…

音频领域的50个关键词

音频领域的50个关键词 前言50个关键词 label: 音频领域&#xff0c;关键词&#xff0c;领域黑话 持续更新中&#xff0c;评论点赞收藏能加快更新的速度…… 前言 本文小结音频领域中高频出现的关键词&#xff0c;便于初入此道的同学有个初略概念。有了这个黑话词典或者研究地图…

C#通过重写Panel改变边框颜色与宽度的方法

在C#中,Panel控件是一个容器控件,用于在窗体或用户控件中创建一个可用于容纳其他控件的面板。Panel提供了一种将相关控件组合在一起并进行布局的方式。以下是Panel控件的详细使用方法: 在窗体上放置 Panel 控件: 在 Visual Studio 的窗体设计器中,从工具箱中拖动并放置一…

WebGL 视图矩阵、模型视图矩阵

目录 立方体由三角形构成 视点和视线 视点、观察目标点和上方向 视点&#xff1a; 观察目标点&#xff1a; 上方向&#xff1a; 在WebGL中&#xff0c;观察者的默认状态应该是这样的&#xff1a; 视图矩阵程序&#xff08;LookAtTriangles.js&#xff09; 实际上&…

Leetcode.146 LRU 缓存

题目链接 Leetcode.146 LRU 缓存 mid 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 c a p a c i t y capacity capacity 初始化 LRU 缓存int get(int key) 如果关键…

Matlab论文插图绘制模板第114期—带图形标记的图

之前的文章中&#xff0c;分享了Matlab带线标记的图&#xff1a; 带阴影标记的图&#xff1a; 带箭头标记的图&#xff1a; 进一步&#xff0c;分享一下带图形标记的图&#xff0c;先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&…

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单AdaptiveTextSelectionToolba样式UI效果

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;我首先查看了TextField中的源码&#xff0c;看到了ToolbarOptions、AdaptiveTextSelectionToo…

深度学习中安装了包但是依然导入(import)失败这一问题,例如pytorch环境下已经安装了scikit-learn但是import不了

在跑深度学习模型的时候我们要先搭建pytorch环境&#xff0c;这个环境跟windows环境是不同的&#xff0c;我们默认在windows中安装的包在当前的虚拟环境中读取不到&#xff0c;所以导致我们明明安装了包但是依然在实际的导入中(import)报错。解决办法就是我们去虚拟环境中安装包…

linux驱动开发day6--(epoll实现IO多路复用、信号驱动IO、设备树以及节点和属性解析相关API使用)

一、IO多路复用--epoll实现 1.核心&#xff1a; 红黑树、一张表以及三个接口、 2.实现过程及API 1&#xff09;创建epoll句柄/创建红黑树根节点 int epfdepoll_create(int size--无意义&#xff0c;>0即可)----------成功&#xff1a;返回根节点对应文件描述符&#xff…

ubuntu:vi 编辑器修改文件的基本操作指令

Vi 编辑器是一个强大的命令行文本编辑器&#xff0c;它有着丰富的功能&#xff0c;但也可能对新用户来说有一些陡峭的学习曲线。下面是一些 Vi 编辑器中的基本操作指令&#xff1a; 1.打开文件 打开 Vi 并打开文件的命令是&#xff1a; vi filename其中 filename 是你要编辑…

构建无缝的服务网格体验:分享在生产环境中构建和管理服务网格的最佳实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…