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

单例模式在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值