【超详细】C#的单例模式
目录
C#的单例模式
1.什么是单例模式?
2.为什么要使用单例模式?好处是什么?
3.单例模式的核心原理
4.两种单例模式
4.1.不继承MonoBehaviour的泛型单例(普通类单例)
4.2.基于MonoBehaviour的泛型单例(Unity组件单例)
5.两种单例模式的使用场景与实例
5.1.不继承MonoBehaviour的单例(普通类单例)
5.2.基于MonoBehaviour的单例(Unity组件单例)
6.使用单例模式的注意事项
6.1.普通类单例(Singleton<T> )注意事项
6.2.Unity组件单例(MonoSingleton<T> )注意事项
6.3.通用注意事项
7.总结
本篇文章分享一下C#的单例模式。
C#的单例模式
1.什么是单例模式?
单例模式(SingletonPattern)是创建型设计模式的一种,核心目标是确保一个类在整个应用程序生命周期中只存在一个实例,并提供一个全局唯一的访问入口(通常是Instance静态属性)。它解决了“频繁创建/销毁对象导致的资源浪费”和“多实例数据不一致”的问题,针对需要全局唯一实例来统一管理的逻辑。
2.为什么要使用单例模式?好处是什么?
单例模式的核心价值在于“唯一性”和“全局可访问性”,具体好处如下:
(1)节省资源:避免频繁创建销毁重量级对象(如数据库连接、配置加载类),减少内存占用和性能开销。
(2)数据一致性:全局唯一实例确保所有模块访问的是同一份数据,避免多实例导致的数据冲突。
(3)简化访问:无需手动传递实例(如通过构造函数注入),通过Instance静态属性即可全局访问,降低代码耦合。
(4)生命周期可控:可统一管理实例的创建、初始化和销毁(如程序退出时释放资源)。
3.单例模式的核心原理
单例模式的实现依赖以下3个核心逻辑,缺一不可:
(1)私有构造函数:禁止外部通过new关键字创建实例(破坏唯一性),仅允许类内部创建。
(2)静态私有实例:用static关键字存储唯一实例(静态成员属于类,而非对象,确保全局唯一)。
(3)静态公共访问入口:通过static Instance属性提供全局访问,内部控制实例的创建逻辑。
4.两种单例模式
4.1.不继承MonoBehaviour的泛型单例(普通类单例)
适用于非Unity组件类,不依赖Unity生命周期,纯C#逻辑实现。
using System;
using System.Reflection;
using UnityEngine;///<summary>
///不继承 MonoBehaviour 的泛型单例模式
///</summary>
///<typeparam name="T">泛型参数,必须是当前类的子类(约束:where T : Singleton<T>)</typeparam>
public class Singleton<T> where T : Singleton<T>
{//1.静态私有实例:存储 T 类型的唯一实例,初始为 null(懒加载)//static:确保实例属于类,全局唯一;private:禁止外部直接修改private static T instance;//2.静态私有锁对象:用于多线程同步,防止并发创建多个实例//readonly:确保锁对象不会被修改,避免锁失效;static:与实例共享同一把锁private static readonly object lockObject = new object();//3.静态公共访问入口:全局唯一获取实例的方式public static T Inst