unity3d中设计模式的学习<一>:泛型单例
2014-11-16 02:55
281 查看
单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须是static的,没办法直接继承,之前看了《面向对象的游戏开发》这本书里,使用的是泛型,于是我实验了几次
现在我们就来实现这个较为简单的单例泛型:
基类做好了,然后下面是派生出的各种功能的单例:
注意到,基类是泛型,所以每个Singleton<T>都是不同的实例 使用时 直接 Singleton<PlayerCtrl>.Instance 就可以返回单例的PlayerCtrl
现在我们就来实现这个较为简单的单例泛型:
public class Singleton<T> : MonoBehaviour where T: MonoBehaviour //因为继承MonoBehaviour的物体不能使用new()来构造实例 所以这里只能用MonoBehaviour { private static T instance; //实例目标对象 protected virtual void Awake() { this.CheckInstance(); //觉醒检查 } protected bool CheckInstance()//是否唯一,不是就销毁多余的目标,防止目标有多个挂载在其他gameobject上。 { if (this == Singleton<T>.Instance) { return true; } UnityEngine.Object.Destroy(this); return false; } public static T Instance { get { if (Singleton<T>.instance == null) { Singleton<T>.instance = (T) UnityEngine.Object.FindObjectOfType(typeof(T));// 如果对象没实例化,则为空 if (Singleton<T>.instance == null) { Debug.LogError(typeof(T) + " was no attached GameObject"); } } return Singleton<T>.instance; } } }
基类做好了,然后下面是派生出的各种功能的单例:
public class PlayerCtrl : Singleton<PlayerCtrl> { ............................................. } public class GameManager: Singleton<GameManager> { ............................................. }
注意到,基类是泛型,所以每个Singleton<T>都是不同的实例 使用时 直接 Singleton<PlayerCtrl>.Instance 就可以返回单例的PlayerCtrl
相关文章推荐
- 设计模式入门--设计模式学习笔记<一>
- 设计模式学习之抽象工厂模式(二)<反射+配置文件>
- OpenCV 2 学习笔记(12): 算法的基本设计模式<3>:单例模式(Singleton pattern)
- 使用设计模式优化设计案例<一>
- 设计模式--设计原则<一>
- 学习笔记——JAVA设计模式<7>桥接模式
- 学习笔记——JAVA设计模式<4>原型模式
- Android中常用的设计模式<一>
- 学习笔记——JAVA设计模式<3>建造者模式
- <大话设计模式学习一>命令模式
- 设计模式<一>-单例模式
- <C/C++ 版> 设计模式 学习之 策略模式
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- OpenCV 2 学习笔记(11): 算法的基本设计模式<2>:使用Controller
- 设计模式<一>——适配器模式
- 设计模式<一>
- 轻松学习Spring<一> IoC容器和Dependency Injection模式
- 学习笔记——JAVA设计模式<15>命令模式
- <C/C++ 版> 设计模式 学习之 工厂模式 <1>
- 泛型(Generics Types)学习笔记<一>