设计模式——通用泛型单例(普通型和继承自MonoBehaviour)
2024-08-28 01:25:19
单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。
普通泛型单例:
public abstract class Singleton<T> where T : class, new()
{
private static T instance = null; private static readonly object locker = new object(); public static T Instance
{
get
{
lock (locker)
{
if (instance == null)
instance = new T();
return instance;
}
}
}
}
继承MonoBehaviour的泛型单例:
using UnityEngine; public abstract class MonoSingleton <T>: MonoBehaviour where T:MonoBehaviour
{
private static T instance = null; private static readonly object locker = new object(); private static bool bAppQuitting; public static T Instance
{
get
{
if (bAppQuitting)
{
instance = null;
return instance;
} lock (locker)
{
if (instance == null)
{
instance = FindObjectOfType<T>();
if (FindObjectsOfType<T>().Length > )
{
Debug.LogError("不应该存在多个单例!");
return instance;
} if (instance == null)
{
var singleton = new GameObject();
instance = singleton.AddComponent<T>();
singleton.name = "(singleton)" + typeof(T);
singleton.hideFlags = HideFlags.None;
DontDestroyOnLoad(singleton);
}
else
DontDestroyOnLoad(instance.gameObject);
}
instance.hideFlags = HideFlags.None;
return instance;
}
}
} private void Awake()
{
bAppQuitting = false;
} private void OnDestroy()
{
bAppQuitting = true;
}
}
使用方法直接用类去继承这两个抽象单例即可,使用T.Instance就可以直接取得该类(T)的唯一实例了。
最新文章
- Python黑帽编程 3.5 DTP攻击
- Make Helix Curve in OpenCASCADE
- JAVA 中数据库连接的方法之一
- C#的委托 Action<;>;和Func<;>;
- C# 事务处理
- [NOI2005] 维修数列
- [LeetCode][Python]Tow Sum
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) : Caching Application Block (初级)
- 可编辑DIV (contenteditable=";true";) 在鼠标光标处插入图片或者文字
- 解决maven web项目Cannot detect Web Project version. Please specify version of Web Project through...的错误
- 数据库SQL,NoSQL之小感悟
- 配置Server Side TAF
- CodeSmith(C#)简单示例及相关小知识
- 解决vs-code高cpu占用率问题
- 家庭记账本小程序之改(java web基础版五)
- YARN调试过程中的常见问题
- javascript高级
- 素数筛选-hdu1262
- [javascript-code-snippet]javascript代码段
- Jmeter发送某个request时而成功,时而失败(处理办法:失败的时候尝试重新发送这个HTTP request)
热门文章
- 2018-4-25-- 2.在sublime3里安装git插件并连接GitHub
- GIS基础软件及操作(三)
- Resolve conflict using ";MERGE_HEAD (origin/HEAD)";
- Java中的逆变与协变 专题
- 16.09 working note
- oracle解析
- 升级d7的代码到2010以上版本注意事项(SetLength的参数就是字符长度,而不是字节长度,但Move函数要改)
- Windows下用VC与QT编译MPI程序入门
- 关于Windows更新窗口内容的问题(作为一个实验,效果很明显)
- 【Eclipse常见错误】-Cannot return from outside a function or method