单例模式在U3D开发中使用比较频繁,它所解决的问题就是希望一个类型创建一个对象且全局共享(静态公开)(创建一次,多次使用),并且可以 控制类型创建对象的数量(绝大多数时候控制数量为一个) 。
单例用一个词表示那就是唯一。
代码案例:
public class Singleton
{
private static Singleton instance;
private void Singleton(){}
public static Singleton GetInstance()
{
if(null == instance)
instance = new Singleton();
return instance;
}
}
私有化构造器后,客户端将无法直接new 对象,只能通过Singleton对外公开的GetInstance()方法创建对象,该方法中有判断对象是否存在的,使得Singleton最终只会创建一个实例,但是该方式在多线程中会出现问题。
改进:
public class Singleton
{
private static Singleton instance;
private static readonly object obj = new object();
private void Singleton(){}
public static Singleton GetInstance()
{
if(null == instance)
lock(this)
{
if(null == instance)
instance = new Singleton();
}
return instance;
}
}
在Unity3D中如何实现单例模式:
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
private static T m_Instance;
public static T instance
{
get
{
if(null == m_Instance )
{
m_Instance = GameObject.FindObjectOfType<MonoSingleton<T>>() as T;//场景中是否在MonoSingleton脚本
if (null == m_Instance)
m_Instance = new GameObject (typeof(T).Name).AddComponent<MonoSingleton<T>>() as T;//若不存在,创建空物体添加脚本
}
return m_Instance;
}
}
protected virtual void Awake()
{
if (null == m_Instance)
m_Instance = this as T;
else
Destroy (this.gameObject);//已存在MonoSingle的实例,销毁物体
DontDestroyOnLoad (this);//切换场景时不进行销毁
}
}
使用时直接继承 MonoSingleton就可以
public class TestSingleton : MonoSingleton<TestSingleton>
{
private TestSingleton(){}//私有化构造器,防止调用者直接new
}
提到单例模式,很容易联想到静态类,那他们到底有何区别呢?
静态类和单例差别:
静态类:
1.常驻内存利用空间换时间,快(不需要频繁 开辟空间,装载数据),频繁使用,
2.生命周期由系统控制;
3.约束类中成员都为静态
适合做成工具类(不需要创建多个实例,频繁使用)
静态类一般不存储对象状态 (字段代表对象的状态,对象的不同是字段不同,而方法单独存放一份)
单例:
对象的生命周期可以由程序员控制
管理方便(例:对象池做成单例为了方便管理对象,使用单例,内存中只有一份)