为什么要出现单例化?
在unity中,会不可避免地出现各脚本之间的交互,但交互过多,会使得代码的维护变得非常麻烦。为了减少消耗,一般都是声明一个全局脚本并声明一个全局变量,让各脚本之间的交互变成与此仅一例脚本交互。一般用于管理系统。
单例化的特点
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例,以静态方法获取。
就我而言,单例化的简单方法
public class A
{
public static A instance;
void Awake()
{
instance = this;
}
}
为了确保唯一性
public class A
{
public static A instance;
void Awake()
{
if(instance == null)
instance = this;
return;
}
}
在unity中,单例化简单的引用为引用、继承方法。例如引用。声明两个脚本,在B中引用A的bool值。
public class A
{
public static A instance;
public bool EXA;
void Awake()
{
if(instance == null)
instance = this;
return;
}
}
public class B
{
public static B instance;
void Awake()
{
if(instance == null)
instance = this;
return;
}
void Update()
{
if(A.instance.EXA)
{
Debug.Log("1");
}
}
可修改值(?)
public class A
{
public static A instance;
public bool EXA = true;
void Awake()
{
if(instance == null)
instance = this;
return;
}
}
public class B
{
public static B instance;
void Awake()
{
if(instance == null)
instance = this;
return;
}
void Update()
{
A.instance.EXA = false;
}
}
但是,这样子的单例化线程并不安全,在开启另一个线程时,系统检测不到instance的存在,会出现创建一个单例,这样子,每一个线程都会创建单例。
借鉴于网上的更加好的方法,但是性能消耗大
public class A
{
private static A instance;
private A (){}
public static A getInstance()
{
if (instance == null)
{
instance = new A();
}
return instance;
}
}
双锁(懒汉模式的一种),性能消耗更小
public class A
{
private volatile A instance = null;
private A(){}
public static A getInstance(){
if(instance == null){
synchronized (A.class){
if(instance == null){
instance = new A();
}
}
}
return instance;
}
}
管理模式,省去重复单例化,直接继承
public class A <T> where T :new()
{
private volatile T instance = null;
private T (){}//?
public static T getInstance(){
if(instance == null){
synchronized (T.class){
if(instance == null){
instance = new T();
}
}
}
return instance;
}
}
public class B : A <B>
{
}
小新见解,有错敬请大佬纠正。