欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

几种单例模式

程序员文章站 2022-03-07 16:04:25
...

单例模式

概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

关键点:

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 where T : new()//表示泛型类型 T 是可以被new
{
static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = new T();
}
return instance;
}
}
}
//泛型单例子类
class SimpleModeSon : SimpleMode
{
public void Print()
{
Console.WriteLine(“单例”);
}
}

相关标签: 单例