C# Unity 面向对象补全计划 设计者模式 之 单例模式

news2025/4/20 12:19:59

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系

了解我的专栏C#面向对象与进阶:http://t.csdnimg.cn/mIitr,尤其是关于类的那篇文章即可,另外尤其需要注意的点就是,类的成员属性可以get和set类对象,只是很少这么举例

首先,单例模式可以理解为只有一个外部访问口的类,是在类的概念上设计的

1.单例模式介绍

      单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问这个实例,它在需要控制资源的访问或确保某些操作只执行一次的场景中非常有用

  也就是说,单例模式不能在类外部去创建新实例,就是不能"new"

特点

分类

一级分类

根据实例创建的时刻分类,可以理解为一级分类

二级分类 

根据优缺点分类,可以理解为建立在一级分类上的二级分类

静态变量初始化:这是饿汉式(Eager Initialization),因为实例在类加载时就已经创建

双重检查锁定:这是懒汉式(Lazy Initialization),因为实例是在第一次需要时才创建,并且通过双重检查锁定来确保线程安全

Lazy<T>:这是懒汉式(Lazy Initialization),因为实例是在第一次需要时才创建,并且使用了 Lazy<T> 类来确保线程安全和延迟加载

2.举栗子

说那么多分类,其实会写会用就行,哪那么多弯弯绕绕的,又不是去考研

 静态变量初始化

注意,实例已经在类中被创建,所以叫饿汉=迫不及待需求对象

// 静态变量初始化
A a = A.Instance;
a.func();

public class A  {
    //单例模式
    //1.私有构造函数
    private A() { }
    //2.私有静态唯一实例
    private static A instance = new A();
    //3.唯一对外开放的公共属性
    public static A Instance => instance;

    public void func() {
        Console.WriteLine("这是一个单例模式");
    }
}

优化方面: 可以设置密封类,并对唯一实例设置为只读状态

sealed 
readonly 

双重检查锁定

        要想实现,懒汉式=对象需要的时候才创建一个,需要objcet的帮忙,其实总的来讲就比静态变量初始化多出一个静态字段和双重锁的逻辑

public class A {
    //1.私有静态字段
    private static A instance = null;
    //2.私有唯一实例,但是这个实例是objcet的
    private static object obj = new object();
    //3.私有构造函数
    private A() {
    }
    //4.唯一对外开放的公共属性
    public static A Instance {
        get {
            if (instance == null) {
                lock (obj) {
                    if (instance == null) {
                        instance = new A();
                    }
                }
            }
            return instance;
        }
    }
}

Lazy<T>

        看到这个大大的T了没有,就是本质上就是泛型类

B b = A<B>.Instance;
b.Func();
public class A<T> //where T :new() ()=>new()
    {
    //1.私有静态唯一实例
    private static Lazy<T> instance = new Lazy<T>();
    //2.公共外部属性
    public static T Instance => instance.Value;
    //3.私有构造函数
    private A() { }
}
public class B
    { 
    public void Func()
        {
        Console.WriteLine("单例模式的使用"); 
    }
}

Q.为什么是instance.Value而不是instance?

A: 因为泛型T的原因,导致instance像是一个对象盒子,而不是属性Instance需要返回的盒子里面的东西

进阶版本:

public class A<T> where T :new() 
    {
    //1.私有静态唯一实例
    private static Lazy<T> instance = new Lazy<T>(() => new());
    //2.公共外部属性
    public static T Instance => instance.Value;
    //3.私有构造函数
    private A() { }
}

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

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

相关文章

电脑屏幕录屏,5个技巧,精准捕捉!

电脑屏幕录屏已经成为了一种常见的行为&#xff0c;无论在工作还是生活中都发挥了重要作用。然而&#xff0c;对于许多人来说&#xff0c;如何进行电脑屏幕录屏可能仍然是一个谜团。 从选择合适的录屏软件到了解录制的技巧&#xff0c;都是需要探索和学习的内容。在这篇文章中…

数据库|SQLServer数据库:模糊查询的三种情况

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 就是字面意思&#xff0c;当数据库的查询条件并不是十分具体时就用到模糊查询&#xff0c;比如查询姓氏为雷的人名&#xff0c;就需要从姓名列模糊查询。 01 like关键字查询 当使用like关键字进行查询时&#xff0c;字…

国央企如何提高监管数据报送效率?

最新动向 近日&#xff0c;国家层面高度重视清理拖欠民营企业账款的问题&#xff0c;并出台了一系列相关政策&#xff0c;要求国有企业在偿还债务方面发挥示范作用。近期发布的报告强调了优化民营经济发展环境的重要性&#xff0c;并提出了六大重点工作&#xff0c;其中包括修…

50etf期权行权采用什么交割方式 ?

50ETF期权是欧式期&#xff0c;要到期日当天才能行权交制&#xff0c;其交割方式是实物交割买卖双方在到期行权日时需要准备一手交钱&#xff0c;一手收货或是一手交&#xff0c;一手收钱&#xff0c;如果持有期权到达到期日之前&#xff0c;投资者认为行权并不划算&#xff0c…

python.tkinter设计标记语言(语法2-语法解析器)

TOC 前言 本文只作为笔记记录。 TinText开源地址&#xff1a;https://github.com/Smart-Space/TinText 语法解析器 从前文可以看到&#xff0c;新的Tin标记语言非常简单&#xff0c;即便是加入嵌套关系&#xff0c;也只是标签级别做个标记就行了。&#xff08;在写这篇文章…

【Python机器学习】回归——局部加权线性回归

线性回归有一个问题就是有可能出现过拟合现象&#xff0c;因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差&#xff0c;从而降低预测的均方误差。 其中一个方法就是局部加权线性回归&#xff08;LWLR…

学习记录——day27 进程间通信 IPC通信机制 消息队列 共享内存

目录 一、IPC通信机制 1、system V提供了三种IPC&#xff08;interprocess communication&#xff09;进程间通信方式 消息队列 共享内存 信号量集 2、该通信机制是独立于进程而存在的:当进程将数据写入该通信对象中后&#xff0c;即使进程已经结束&#xff0c;对象中保存的…

吴恩达机器学习COURSE1 WEEK2

COURSE1 WEEK2 多维特征 在线性回归中&#xff0c;往往特征不止一个&#xff0c;而是具有多维特征 例如&#xff0c;在预测房价的例子中&#xff0c;我们知道更多的信息&#xff1a; x 1 x_1 x1​&#xff1a;房屋的面积 x 2 x_2 x2​&#xff1a;卧室的数目 x 3 x_3 x3​&a…

【嵌入式】常用英文缩写及单词整理

目录 嵌入式常用英文缩写及单词整理1. 缩写部分2. 词汇部分3. 语句部分4. 调试部分5. 结束语相关文章&#xff1a; 嵌入式常用英文缩写及单词整理 1. 缩写部分 缩写全称翻译AADCAnalog-to-Digital Converter模/数转换器&#xff0c;模数转换器ADUApplication data unit应用数…

KBEngine ue5

前言 最近在试 KBEngine 的 ue4 项目&#xff0c;它在 ue4 下能够正常编译使用&#xff0c;但是现在都已经进入 ue5 时代&#xff0c;那么能不能将现有工程移到 ue5 下呢&#xff1f; 使用 ue5 打开工程的报错处理 1、DefaultBuildSettings BuildSettingsVersion.V5; kbeng…

python.tkinter设计标记语言(渲染2-渲染器)

TOC 前言 本文仅作为笔记记录。 在前文中&#xff0c;我们通过标记意义解释生成了带有明确渲染要求的参数组&#xff0c;以<title>为例&#xff0c;我们获取了title, level两个明确的渲染标记&#xff0c;这一部分由Tin标记解释器完成&#xff0c;不需要编写者花费过多…

亚马逊、eBay、沃尔玛等海外跨境电商测评自养号的技术解决方案

随着跨境电商的蓬勃发展&#xff0c;卖家们对于提升店铺流量、销量以及产品评价的需求日益迫切。在这一背景下&#xff0c;海外跨境电商测评成为了一个备受瞩目的领域。作为一家专注于此领域的技术型公司&#xff0c;凭借其深厚的技术积累和丰富的实战经验&#xff0c;为卖家们…

supermap制作发布二三维地图服务

一、下载安装 软件版本&#xff1a; SuperMap iDesktopX 11i(2023) SP1 for Windows SuperMap iServer 11i(2023) SP1 for Windows 下载地址&#xff1a; http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 二、运行 服务端&#xff1a;双击iserver的…

HTML学习笔记——用HTML记录学习过程4——非主体结构元素

非主体结构元素主要是为了表达逻辑结构或者附加信息的元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非主体结构元素</title> </head> <body> <header><h1>head…

大模型落地应用架构的一种模式

经过几个月的实践和探索&#xff0c;看过也经历过一些成型的项目了&#xff0c;如果是奔着落地去的&#xff0c;我们的目光不能只盯着大模型本身&#xff0c;而应该放眼甚至是需要投入精力去建设很多我们别的工作上。 本文&#xff0c;着重讲的是&#xff0c;我的理解下现实成…

「实战应用」着色器对图表控件LightningChart的影响及应用

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【图书推荐】《数据资产管理核心技术与应用》

内容简介 《数据资产管理核心技术与应用》深入探讨数据资产管理的核心技术与应用&#xff0c;融入作者在大数据领域多年的丰富经验。《数据资产管理核心技术与应用》为读者提供一套可以落地的数据资产管理框架&#xff0c;并详解两个基于该框架进行数据资产管理的应用案例&…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-09 ICMP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

github技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 Commits没有算入每天的activity fork的仓库是不算的。 Commits made in a fork will not count toward your contributions. 参考&#xff1a; Contribution activity not shown for github…