您现在的位置是:首页 >技术教程 >[Unity] No.1 Single单例模式网站首页技术教程
[Unity] No.1 Single单例模式
简介[Unity] No.1 Single单例模式
单例模式
1. 基础
定义:单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。在Unity的编程中比如①用于输入管理的InputManager;②时间中心EventSystem等,这类具有很强且频繁功能的组件往往会写成单例的模式。
类型:单例模式可分为懒汉模式和饿汉模式两种,本文不做详细讲述。
懒汉式:在真正需要使用对象时才去创建该单例类对象;
饿汉式:在类加载时已经创建好该单例对象,等待被程序使用;
代码:一个C#单例模式的代码如下,其定义了一个class T的一个单例
using System;
namespace UnityLearn
{
public class Single<T>
where T: class
{
private static T _instance;
// 没有实例时创建一个实例,有的话返回创造过的那个实例
public static T Instance
{
get
{
if (_instance == null)
{
Type type = typeof(T);
_instance = Activator.CreateInstance(type, true) as T;
}
return _instance;
}
}
protected Single(){}
}
}
在实际使用时,如想创建一个Class的单例可直接使用以下方式:
public class A : Single<A>
{
// 类内容
}
2. SingleMono
但是我们在Unity中往往都会用到MonoBehavior,此时需要将单例代码稍加修改:
public class SingleMono<T> : MonoBehaviour
where T: SingleMono<T>
{
protected static T instance;
// 创建一个GameObject,也是单例的
private static GameObject go;
public static T Instance
{
get
{
// 在创建时也会检查go
if (instance == null)
{
if (!go)
{
// go不存在时先Find,找不到的话再创建
go = GameObject.Find("SingletonMono");
if (!go)
{
go = new GameObject("SingletonMono");
}
// 不被销毁
DontDestroyOnLoad(go);
// 从物体上获得单例
instance = go.GetComponent<T>();
// 物体上没有单例时添加一个单例
if (!instance)
{
instance = go.AddComponent<T>();
}
}
}
return instance;
}
}
}
实际使用时用法类似:
public class A : SingleMono<A>
{
// 类内容
}
代码中的where T: SingleMono<T>
我也难以理解是什么意思,有知道的朋友请答疑解惑,不胜感激。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。