Unity程序基础框架(一)单例模式

# 单例模式

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() 调用类中的方法。

posted @ 2021-09-11 12:14  专心Coding的程侠  阅读(275)  评论(0编辑  收藏  举报