UFL1-1——不继承MonoBehaviour的单例模式基类

不继承MonoBehaviour的基类

利用泛型相关知识,实现单例模式基类,对于可能存在的安全问题,详见UFL1-3——安全性问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 不继承MonoBehaviour的单例模式基类,内部为静态变量和静态属性,单例模式类可以直接继承该类,而无需自行实现单例声明相关内容
/// </summary>
/// <typeparam name="T">继承该类的类</typeparam>
public class BaseManager<T> where T : class, new()
{
private static T instance;

private static T Instance
{
get
{
if (instance == null)
instance = new T();
return instance;
}
}
}

使用方法

1
2
3
4
5
6
7
8
9
using UnityEngine;

public class TestMgr : BaseManager<TestMgr>
{
public void Speak()
{
Debug.Log("TestMgr");
}
}
1
2
3
4
5
6
7
8
9
using UnityEngine;

public class Main : MonoBehaviour
{
void Start()
{
TestMgr.Instance.Speak(); //如果运行正确,这里会正常输出内容
}
}

输出:image

现在的安全问题

  1. 构造函数问题:由于没有声明私有构造函数,这意味着构造函数可在外部调用,这样的单例可能会破坏唯一性

    1
    TestMgr test = new TestMgr();
  2. 多线程问题:当多个线程同时访问管理器时,可能会出现共享资源的安全访问问题