单例模式(Singleton),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。并且提供一个访问它的全局访问点。
Singleton 类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。
单线程时候的单例类
class Singleton
{
//私有静态实例
private static Singleton instance;
//私有化无参构造 不能在类外部创建实例
private Singleton()
{
}
//此方式是获取本类的唯一实例
public static Singleton GetInstance()
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
多线程时候的单例类
多线程的程序中,多个线程同时,注意是同时访问Singleton类,调用GetInstance()方法,会有可能创建多个实例。所以可以给进程加一把锁来处理,lock是确保当一个线程位于代码的临街区时,另一个线程不能够进入临界区,如果其他线程试图进入锁定的代码,则它将会一直等待(即被阻止),直到该对象被释放。
class Singleton
{
private static Singleton instance;
//程序运行时创建一个静态只读的进程辅助对象;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
//在同一个时刻加了锁的那部分程序只有一个线程可以访问;
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
双重锁定单例类
当同时有两个线程调用了GetInstance()方法时,他们都可以通过第一重的instance==null的判断,然后由于lock机制,只有一个线程进入,另一个排队等候,当第一个释放了之后,如果没有第二重instance==null判定,就可能创建出两个实例。
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance==null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
unity常用的两种单例模式
1.这个是不继承自MonoBehaviour的,通常用在不使用unity特性的脚本
public class Singleton<T>
{
private static T _instance;
protected Singleton()
{
Init();
}
public static T Instance
{
get
{
if (_instance == null)
{
_instance = Activator.CreateInstance<T>();
}
return _instance;
}
}
protected virtual void Init() { }
}
2.继承自MonoBehaviour的单例 拥有Awake() Start() Update() 方法 等unity特性的 单例。
abstract public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
private static bool _bIsDestroy = false;
private static T _instance = null;
void Awake()
{
AwakeHandle();
}
public static T Instance
{
get
{
if (_instance == null && !_bIsDestroy)
{
_instance = FindObjectOfType(typeof(T)) as T;
if (_instance == null)
{
GameObject obj = new GameObject(typeof(T).Name, typeof(T));
_instance = obj.GetComponent<T>() as T;
//if (typeof(T).Equals(typeof(MonsterController)))
//{
//Debug.Log("new MonoSingle");
//}
}
_bIsDestroy = false;
}
return _instance;
}
}