单例模式在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.约束类中成员都为静态 适合做成工具类(不需要创建多个实例,频繁使用) 静态类一般不存储对象状态 (字段代表对象的状态,对象的不同是字段不同,而方法单独存放一份) 单例: 对象的生命周期可以由程序员控制 管理方便(例:对象池做成单例为了方便管理对象,使用单例,内存中只有一份)