设计模式——单例(Unity3D中的应用)

来源:互联网 发布:高通一键开启写号端口 编辑:程序博客网 时间:2024/06/07 05:06

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

0 0