单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。

普通泛型单例:

 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)的唯一实例了。

最新文章

  1. Python黑帽编程 3.5 DTP攻击
  2. Make Helix Curve in OpenCASCADE
  3. JAVA 中数据库连接的方法之一
  4. C#的委托 Action&lt;&gt;和Func&lt;&gt;
  5. C# 事务处理
  6. [NOI2005] 维修数列
  7. [LeetCode][Python]Tow Sum
  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) : Caching Application Block (初级)
  9. 可编辑DIV (contenteditable=&quot;true&quot;) 在鼠标光标处插入图片或者文字
  10. 解决maven web项目Cannot detect Web Project version. Please specify version of Web Project through...的错误
  11. 数据库SQL,NoSQL之小感悟
  12. 配置Server Side TAF
  13. CodeSmith(C#)简单示例及相关小知识
  14. 解决vs-code高cpu占用率问题
  15. 家庭记账本小程序之改(java web基础版五)
  16. YARN调试过程中的常见问题
  17. javascript高级
  18. 素数筛选-hdu1262
  19. [javascript-code-snippet]javascript代码段
  20. Jmeter发送某个request时而成功,时而失败(处理办法:失败的时候尝试重新发送这个HTTP request)

热门文章

  1. 2018-4-25-- 2.在sublime3里安装git插件并连接GitHub
  2. GIS基础软件及操作(三)
  3. Resolve conflict using &quot;MERGE_HEAD (origin/HEAD)&quot;
  4. Java中的逆变与协变 专题
  5. 16.09 working note
  6. oracle解析
  7. 升级d7的代码到2010以上版本注意事项(SetLength的参数就是字符长度,而不是字节长度,但Move函数要改)
  8. Windows下用VC与QT编译MPI程序入门
  9. 关于Windows更新窗口内容的问题(作为一个实验,效果很明显)
  10. 【Eclipse常见错误】-Cannot return from outside a function or method