C#关于单例的基本原理并结合unity

单例:让工程中只有一个实例对象
单例实现:
1、创建类类型的静态变量
2、静态方法
(1)判断静态变量是否为空
(2)如果为null——构建对象 如果不为null——直接return静态变量

using System;

namespace 单例{
	class SimpleDemo{
		public static SimpleDemo instance;

		public static SimpleDemo getInstance(){
			if(instance == null){
				instance = new SimpleDemo();
			}
			return instance;		
		}
	}

	class MainClass{
		public static void Main(string[] args){
			SimpleDemo s1 = SimpleDemo.GetInstance();
		}		
	}
}

特殊的单例模式——只创建一个对象

using System;

namespace 特殊单例{
	class SimpleDemo{
		public static SimpleDemo instance;
		//构造函数
		public SimpleDemo(){
			instance = this;		
		}

		public void show(){
			Console.WriteLine("");
		}
	}

	class MainClass{
		public static void Main(string[] args){
			SimpleDemo sd = new SimpleDemo();//只创建一个对象,如果再创建对象会替换该实例对象
			SimpleDemo.instance.show();
		}		
	}
}

下面结合unity写单例,写之前补充下,unity中脚本继承monobehaviour的类通常不写构造函数,也不在构造函数中初始化变量,一般是使用start和awake初始化变量。(在编辑模式下也会自动调用构造函数,无法预计何时调用,容易带来空参数异常)

我们在用unity时经常会遇到多个单例,此时可以封装一个单例类模板,其他类继承就可以变成单例。

public sealed class SingletonTemplate<T> : MoneBehaviour where T : MoneBehaviour
{
	private static volatile T instance;
	private static object syncRoot = new Object();

	public static T Instance{
		get{
			if(instance == null){
				lock(syncRoot){
					if(instance == null){
						T[] instances = FindObjectsOfType<T>();
						if(instance != null){
							for(var i = 0; i<instances.Length;i++){
								Destroy(instance[i].gameObject);
							}
						}
						GameObject go = new GameObject();
						go.name = typeof(T).Name;
						instance = go.AddComponent<T>();
						DontDestroyOnLoad(go);
					}
				}
			}
			return instance;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值