单例:让工程中只有一个实例对象
单例实现:
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;
}
}
}