单例基类

什么是单例模式

单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式确保一个类只有一个实例并提供一个全局访问点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 文章被收录于专栏

个人学习用

全部评论

相关推荐

点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-23 18:30
美团优选内容调整,屁股都没离开座椅呢,多多买菜来挖了
熬夜脱发码农:哈,拼多多真挖人是吧
投递美团等公司8个岗位 >
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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