# 单例模式
1.C#中的泛型的知识
2.设计模式中,单例模式的知识
Unity中的单例模式 和C#中的是一样的,
Unity中的类默认都是继承Monobehaviour类,但是一般情况下,建议不要这么做,而是自己写单例类。
单例的作用:在整个游戏过程中唯一一个单实例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//传统的单例模式
public class Singleton //不要继承Monobehaviour
{
private static Singleton instance; //唯一一个单实例,所以类中的这个字段是私有的
public static Singleton Instance //对应的属性
{
get {if (instance == null) //如果实例是空的,就new 一个实例
instance = new Singleton(); //如果实例不是空的,就返回这个实例
return instance; //所以实例就只有一个,实现了单例的内容
}
}
private Singleton() //构造函数可以省略,没有程序员会new单例模式
{
}
}
Singleton类的构造函数:(可以省略) private Singleton() {...}
因为不能在外部创造 new这个实例,所以需要把构造函数设置成私有的。
(在和别人合作的时候,有些人不写这个构造函数,没有设置成私有的,这个不需要纠结,因为实际的项目开发中,被告知此类是单例,一般都不要去New这个类了,所以写不写都可以,写了是锦上添花)。
问题:在一个游戏项目中可能有很多类,可能都是管理者角色的类,管理者角色的类在项目运行中要求都是单例,如果三个、四个都是单例,那么上面的 传统单例模式的代码 就要重复写好几遍。
提出解决方达:如果有泛型的单例类,如果有一个类是单例类,那么只要继承这个单例类就可以更方便。
//凡是单例模式类,都可以继承该类,实现单例
public class Singleton<T> where T : new() //泛型约束 必须有无参构造函数
{
private static T instance;
public static T Instance
{
get {
if (instance == null)
instance = new T();
return instance;
}
}
}
public class Singleton<T> where T : new() //泛型约束 必须有无参构造函数
T类型并不是所有类型都可以,where用来对T进行约束,需要是能new出来的T才可以,泛型约束,必须有无参构造函数。
//访问示例
public class UIManager : Singleton<UIManager>
{
public void Say()
{
}
}
public class AudioManager : Singleton<AudioManager>
{
}
public class Test
{
void Main()
{
UIManager.Instance.Say();
}
}
UIManager直接通过.Instance进行实例化,然后通过实例化.Say() 调用类中的方法。