标签:
单例模式是设计模式中最简单,他要求设计者保证该类只有一个实例,之前我是挂载脚本实现单例,
该方法非常简单,使用的直接调用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