单例模式
概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
C#的单例:
1.饿汉模式:
public class Person
{
//饿汉模式,在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
static Person person = new Person();
public static Person Instance()
{
return person;
}
}
2.懒汉模式:
public class Person
{
//懒汉模式,比较懒,在类加载时,不创建实例,用到时再创建,因此类加载速度快,但运行时获取对象的速度慢
static Person instance;
public static Person Instance()
{
if (instance==null)
{
instance = new Person();
}
return instance;
}
}
Unity单例:
public class Person:MonoBehaviour
{
//unity单例,脚本需挂在场景物体上
public static Person Instace;
//要在初始化时赋值(一般在Awake里赋值,确保在第一时间被初始化,以免在使用时为完成初始化赋值)
private void Awake()
{
Instace = this;
}
}
多线程单例:
//当多个线程同时访问了Instance属性,并且两个线程对instance判断为空,两个都会new实例对象
//会违背单例设计,可以使用Lock锁定资源(在cpu同一时刻有且只有一个线程可以访问子资源)
//两个线程同时进入,会违背单例设计(某种意义上unity是支持多线程,只是非主线程很多Unity的API无法调用)
//声明静态资源,供Lock字段锁住(当被锁资源被访问时就会被锁定,其他来访问时会自动等待)
class Person
{
static object o = new object();
static Person instance;
public static Person Instance
{
get
{
lock (o)
{
if (instance == null)
{
instance = new Person();
}
return instance;
}
}
}
}
泛型单例:
// 当有多个单例类需要你定义时,可以定义一个泛型单例父类(被其他类继承成为单例类)
//需要对T增加泛型修饰
//泛型单例父类
class SimpleMode<T> where T : new()//表示泛型类型 T 是可以被new
{
static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = new T();
}
return instance;
}
}
}
//泛型单例子类
class SimpleModeSon : SimpleMode<SimpleModeSon>
{
public void Print()
{
Console.WriteLine("单例");
}
}