Unity-单例模式

前言

​ 对于某些特殊的类,我们希望 在整个程序的生命周期只创建一个该类的对象 ,或是希望 在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成 单例模式

单例的简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test()
{
pubic abstract Test Instance;//创建程序中该类的唯一一个对象

private void Awake()//在程序启动时,直接创建一个该类的对象
{
if(Instance!=null)//如果已经创建了一个变量,便将该变量删除
{
Destroy(gameObject);
}

Instance = this;
}
}

泛型单例

为什么需要泛型单例

​ 在通常的游戏制作中,我们会创建许多的 Manager 来管理我们的游戏,如果每创建一个 Manager 都要重新写一遍单例会非常麻烦,因此就需要 泛型单例

代码实现

泛型单例,顾名思义就是事先不知道单例的类型,其类型取决于继承该泛型父类的子类

​ 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Singleton<T> : MonoBehaviour where T :Singleton<T> //where确定继承该父类的是什么类型的子类
{
private static T instance;

//用于获取单例的属性
public static T Instance
{
get { return instance;}
}

//程序启动时调用,给单例唯一变量赋值
protected virtual void Awake()
{
if(instance != null)
{
Destroy(gameObject);
}
else
{
instance = (T)this;
}
}

//判断单例是否已经被创建的属性
public static bool IsInitialized
{
get { return instance != null;}
}

//销毁函数
protected void OnDestroy()
{
if(instance == this)
{
instance = null;
}
}
}

更多可能

​ 如果我们在一个项目中 过度使用单例模式,就会造成该项目的 耦合性非常高,一个单例中的某个变量,可能同时被十几个对象引用,导致牵一发而动全身,使得项目 难以维护。我们急需一种方法,能够提供单例模式的功能,但又没有单例模式如此之高的耦合度。

​ 分析单例模式的功能:它能够让我们在任何地方读取某个对象的信息,但前提是我们必须持有这个对象的引用。那么有没有什么方法可以不持有该对象的引用,但仍然可以读取该对象的信息呢?

​ 这时候我们就可以使用设计模式中的 观察者模式

参考资料

观察者模式 - AshScops - 博客园 (cnblogs.com)

观察者设计模式 (refactoringguru.cn)