unity3d中设计模式的学习<一>:泛型单例
单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须是static的,没办法直接继承,之前看了《面向对象的游戏开发》这本书里,使用的是泛型,于是我实验了几次
现在我们就来实现这个较为简单的单例泛型:
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
unity3d中设计模式的学习<一>:泛型单例的更多相关文章
- Java学习笔记之---单例模型
Java学习笔记之---单例模型 单例模型分为:饿汉式,懒汉式 (一)要点 1.某个类只能有一个实例 2.必须自行创建实例 3.必须自行向整个系统提供这个实例 (二)实现 1.只提供私有的构造方法 2 ...
- 设计模式——通用泛型单例(普通型和继承自MonoBehaviour)
单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where ...
- 创建类模式(五):单例(Singleton)
定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...
- javascript学习(9)——[设计模式]单例
单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...
- Javascript设计模式学习二(单例)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 普通的单例模式: 使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象.比如:使用 ...
- C# 泛型单例
不支持非公共的无参构造函数的 public abstract class BaseInstance<T> where T : class,new() { private readonly ...
- SpringMVC学习笔记:单例与并发问题
Spring中的Bean默认都是单例(singleton),Spring中Bean的scope属性有五种类型: singleton 表示在spring容器中的单例,通过spring容器获得该bean时 ...
- Unity&C# SingerMonoManager泛型单例
管理各种管理器 ///为什么需要单例 ///单例模式核心在于对于某个单例类,在系统中同时只存在唯一一个实例,并且该实例容易被外界所访问: ///避免创建过多的对象,意味着在内存中,只存在一个实例,减少 ...
- scala学习手记14 - 单例对象
java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...
随机推荐
- 手写css按钮组
css: .lf{float:left} .btn{ width:60px; height:24px; color:#fff; border-radius:4px; cursor:pointer; b ...
- Java Collection.Map
/** * Map集合的特点: * 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. * * Map集合的功能和概述: * 1.添加功能 * V put(K key , V ...
- Make sure that the controller has a parameterless public constructor.
An error occurred when trying to create a controller of type 'CCD.Web.Controllers.TWAccountControlle ...
- webservice log4net日志写入失败
原因1:如果webservice和调用者都部署在一台机器上,日志有可能写到了项目所在目录中,虽然你添加的服务引用是部署在iis下的,但不会写到这.暂时解决办法,把webservice部署到内网服务器上 ...
- WPF MVVM 之理解(数据绑定)
(申明:最近在做一个练习,写点东西,谨供参考.) 1.界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(Entity Framework)实体框架,不做介绍). ...
- [编程] C语言变量和数据类型总结练习题
练习题: 1) 如何用 printf() 输出 short.int.long 类型的整数,请举例说明. 2) 如何用 printf() 输出 float.double 类型的小数,请举例说明. 3) ...
- 四 Scatter/Gather
scatter/gather用于描述从Channel中读取或者写入到Channel的操作. 分散(scatter):从Channel中读取在读操作中将读取的数据写入多个Buffer中.因此,Chann ...
- js-js和HTML的两种结合方式
第一种: - 使用一个标签 <script type="text/javascript"> js代码; </script> 第二种: - 使用script标 ...
- 手贱--npm 误改全局安装路径
修改全局安装命令: 通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefix 来获取当前设置的目录. 我的node ...
- vim的日常使用
Esc 退出编辑模式,输入一下命令 :wq保存后退出 :wq!强制保存后退出 :w保存但不退出 :w!若文件为只读,强制保存 :q不保存退出 :q!不保存强制退出 :e!将文档还原到最原始状态