单例模式:

定义:单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。[DP]

通常我们可以使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。[DP]

类图:
undefined
对应代码:

class Singleton
    {
        private static Singleton _instance;
        private Singleton()         //将构造方法设为私有,外界无法利用new创建此类实例的可能
        {

        }
        public static Singleton GetInstance()
        {
            if(null==_instance)     //如果实例不存在就new一个新实例,否则返回已有的实例
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }

##unity3d中单例的应用

  • 不在场景中创建物体,可以用来保存临时数据,可以用静态类替代

代码与上面相同:

public class Singleton  {

    private static Singleton _instance;
    private Singleton()         //将构造方法设为私有,外界无法利用new创建此类实例的可能
    {

    }
    public static Singleton GetInstance()
    {
        if (null == _instance)     //如果实例不存在就new一个新实例,否则返回已有的实例
        {
            _instance = new Singleton();
        }
        return _instance;
    }
}
  • 创建继承自MonoBehaviour的单例,调用时在场景中创建物体
public class UnitySingleton : MonoBehaviour
{
    static UnitySingleton _instance;

    public static UnitySingleton Instance {
        get {
            if (_instance == null)
            {
                GameObject obj = new GameObject("UnitySingleton");

                DontDestroyOnLoad(obj);         //保证在切换场景时不被销毁
                _instance = obj.AddComponent<UnitySingleton>();
            }
            return _instance;
        }
    }
}
  • 同样是继承自MonoBehaviour
public class UnitySingleton : MonoBehaviour
{

    public static UnitySingleton _instance;

    void Awake()
    {
        if(_instance==null)
        {
            _instance = this;
            DontDestroyOnLoad(this);
        }
        else
        {
            Destroy(this);
        }
    }
}

第二种是在调用时才创建,第三种在游戏开始时就已经创建

创建单例泛型类:

public class SingletonManager<T> : MonoBehaviour
    where T : Component
{
    private static T _instance;
    public static T Instance {
        get {

            if (_instance == null)
            {
                GameObject obj = new GameObject();
                DontDestroyOnLoad(obj);             //切换场景时不被销毁
                _instance = obj.AddComponent<T>();
            }

            return _instance;
        }
    }
}

将单例类继承自该类即可

参考:
《大话设计模式》----程杰
http://blog.csdn.net/candycat1992/article/details/10960731