单例基类

什么是单例模式

单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式确保一个类只有一个实例并提供一个全局访问点C#中实现单例有很多种实现方法,在所有的实现版本中,都有以下几个共同点:

  • 唯一的、私有的且无参的构造函数,这样不允许外部类进行实例化;
  • 类是密封的,尽管这不是强制的,但是严格来讲从上一点来看密封类能有助于JIT的优化;
  • 一个静态变量应该指向类的唯一实例
  • 一个公共的静态变量用于获得这个类的唯一实例(如果需要,应该创建它);

这里简单介绍两个实现模式

懒汉式(LazyLoading):需要才创建实例,延迟加载;

饿汉式:第一时间创建实例,类加载就马上创建;

单例基类-C#

使用泛型T指定实例类型,使用无参构造函数约束new基类约束;由于全局唯一,使用静态属性Instance并在获取属性时判断属性是否为空,空则new一个,反之直接返回instance。(以上通过属性实现在get时才真正实例化对象的Lazy Loading模式避免了资源浪费,由于Unity一般不采用多线程的开发模式,Lazy Loading模式基本能满足需求)

public abstract class Singleton<T> where T : Singleton<T>, new()
{
	private static T instance;
	public static T Instance
	{
		get
		{
			if(instance == null)
			{
				instance = new T();
			}
			return instance;
		}
	}
}

注:new确保在类内可以对T进行实例化,基类约束的意义是限定传进来的泛型参数为Singleton的子类,写的时候把自己传进去

单例基类-MonoBehavior

适用于挂载在游戏物体的脚本对象。挂载在游戏物体上的脚本对象生命周期和游戏物体一致,故使用饿汉式实现单例模式。

public abstract class SingletonMono<T> : MonoBehavior where T : Singleton<T>
{
	private static T instance;
	public static T Instance { get => instance; }
	
	protected virtual Awak()
	{
		if (instance == nul)
		{
			instance = (T)this;
		}
	}
}

注:如果Mono单例对Awake进行重写必须要base.awake完成实例化

JKFrame v1.0 文章被收录于专栏

个人学习用

全部评论

相关推荐

点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
董春花_:真诚无罪,别听评论区那个清华的。按他的逻辑,你有分寸人觉得你是不想来,你积极热情人觉得你太想来,你好骗人就可你养鱼,你不好骗人觉得你服从性不高,合着**做啥都白扯。保持谦逊礼貌与对offer的积极性不才是最正常,也正确的做法么?招聘方的错强加到应聘者身上,***何不食肉糜。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务