码迷,mamicode.com
首页 > 其他好文 > 详细

23种设计模式式之Singleton(单例设计模)【学习笔记】

时间:2015-10-17 17:43:13      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

单例模式是设计模式中最简单,他要求设计者保证该类只有一个实例,之前我是挂载脚本实现单例,

该方法非常简单,使用的直接调用Singleton.instance就可以了

using UnityEngine;
using System.Collections;

public class Singleton : MonoBehaviour {

    public static Singleton instance;

    void Awake(){

        instance = this;
    }
}

但是这种写法并不规范,因为它可以实例对象,因为构造函数没被私有化

同时instance的值也可被改变,例如Singleton.instance = null;

而且别的类在Awake中不好调用Singleton的实例,因为脚本执行顺序是不定的,非要调用还得设置脚本的执行顺序

下面这种写法是较标准的写法

using UnityEngine;
using System.Collections;

public class Singleton{
     
    private static Singleton _instance;
    public static Singleton Instance{

        get{

            if(_instance == null){

                _instance = new Singleton();
            }
            return _instance;
        }
    }

    //禁止外部实例对象
    private Singleton(){}
}

 这种写法还解决了跳转场景销毁对象的问题,用前一种方法还得在挂载物体上添加DontDestroyOnLoad(this.gameObject)

如果要解决数据初始化问题,前一种是在Start()内完成,后一种即可提供Init方法在外部调用,也可以在第一次创建对象后完成

 

然而一个项目中可能用到多个单例,如TaskManage,PlayerManage

所以可以用泛型去创建一个单例的子类

using UnityEngine;
using System.Collections;

public class Singleton<T> where T : new(){
     
    private static T _instance;
    public static T Instance{

        get{

            if(_instance == null){

                _instance = new T();
            }
            return _instance;
        }
    }

    //禁止外部实例对象
    protected Singleton(){}
}

 

using UnityEngine;
using System.Collections;

public class Manage : Singleton<Manage> {
    
    //禁止外部实例对象
    private Manage(){}
}

 

23种设计模式式之Singleton(单例设计模)【学习笔记】

标签:

原文地址:http://www.cnblogs.com/yuwenxiaozi/p/4887489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!