概述
单例模式在软件开发过程中是非常常用的,它提供了一种全局访问的静态方法,提供全局的管理类,和公共访问中心,简单来说就是提供一个唯一的类,然后在程序的任何位置都可以访问到它,它的属性和方法都是共用的,不过就会有这样的一个问题,那给所有属性方法都加上静态字段那是否可以呢,当然也是可以的,不过那得加多少,每个都得加才行,如果属性字段比较多那也不便于维护。
基于MonoBehaviour的最简单实现方式(Demo)
注意点:把这个脚本挂载在任意一个游戏物体上,一定只能有一个!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton : MonoBehaviour
{
public static Singleton Instance;
// Start is called before the first frame update
void Start()
{
Instance = this;
}
// Update is called once per frame
void Update()
{
}
}
脱离MonoBehaviour的单例
在真实项目开发的时候,项目都是有框架的,框架几乎都是脱离MonoBehaviour的,所以也要学会脱离MonoBehaviour的单例用法。
懒汉式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton
{
private static Singleton singleton;
public static Singleton Instance
{
get
{
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
}
饱汉式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton
{
private static Singleton singleton = new Singleton();
public static Singleton Instance { get { return singleton; } }
}
这种单例的创建方法是懒汉式的,当用到的时候再创建,还有饱汉式的,还没使用的时候就创建,在代码声明的时候就创建对应的实例,或者在静态构造函数中,两个办法主要的区别是在内存的占用中,因为饱汉式的创建,在开始就会为这个静态类分配内存,可能这时候并没有使用到这个类,但是却消耗了内存,造成了内存的浪费,懒汉式的创建是在用到这个类的时候再创建,减少了没有使用的时候内存的浪费,但是会多消耗一些性能。总之,没有那种方法是最好的,适合自己项目的才是最重要的,要根据实际需求来。
单例类
当然其实想,为每个单例写一个访问器也比较麻烦,所以可以用一个单例的泛型类来统一这个方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton<T> where T : class, new()//单例父类
{
private static T singleton;
public static T Instance
{
get
{
if (singleton == null)
{
singleton = new T();
}
return singleton;
}
}
}
public class Programmer : Singleton<Programmer>//单例子类
{
}
使用方法,就是直接继承自这个父类,传入自己的类名,别的方法在访问的时候就可以拿到单例类。