文章目录
一、前言
点关注不迷路,持续输出Unity
干货文章。
嗨,大家好,我是新发。我决定弄一期设计模式主题的文章。
本篇主题:单例模式
二、饿汉式单例模式
// 饿汉式单例模式
public class EagerSingleton
{
private static EagerSingleton _instance = new EagerSingleton();
public EagerSingleton GetInstance()
{
return _instance;
}
}
public class Test
{
void static Main(string[] args)
{
EagerSingleton.GetInstance();
}
}
类被加载时,静态变量_instance
会被初始化,单例类的唯一实例就被创建出来了。
饿汉式的称谓很形象,在装载类的时候就创建对象实例。
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,
先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
三、懒汉式单例模式
// 懒汉式单例模式
public class LazySingleton
{
private staitc LazySingleton _instance = null;
public staitc LazySingleton GetInstance()
{
if(null == _instance)
{
_instance = new LazySingleton();
}
return _instance;
}
}
public class Test
{
void static Main(string[] args)
{
LazySingleton.GetInstance();
}
}
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。
当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
四、懒汉双重检查加锁单例模式
// 懒汉双重检查加锁单例模式
public class SyncLazySingleton
{
private staitc SyncLazySingleton _instance = null;
public staitc SyncLazySingleton GetInstance()
{
// 先检查实例是否存在,如果不存在才进入下面的同步块
if(null == _instance)
{
// 同步块,线程安全的创建实例
lock (_instance)
{
// 再次检查实例是否存在,如果不存在才真正的创建实例
if(null == _instance)
_instance = new SyncLazySingleton();
}
}
return _instance;
}
}
public class Test
{
void static Main(string[] args)
{
SyncLazySingleton.GetInstance();
}
}
所谓双重检查加锁
机制,指的是:并不是每次进入GetInstance
方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查。
进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。
这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。
这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。
关于lock语句:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/lock-statement
五、懒汉式属性get单例模式
// 懒汉式属性get单例模式
public class AttributeSingleton
{
public string Name { get; set; }
private static AttributeSingleton _instance;
public static AttributeSingleton Instance
{
get
{
if(null == _instance)
{
_instance = new AttributeSingleton();
}
return _instance;
}
}
}
public class Test
{
void static Main(string[] args)
{
AttributeSingleton.Instance.Name;
}
}
在懒汉式单例模式的基础上,利用属性的方法实现单例模式。
六、MonoBehaviour单例模式
// MonoBehaviour单例模式
public class UnitySingleton : MonoBehaviour
{
private static UnitySingleton _instance = null;
void Awake()
{
_instance = this;
}
public static UnitySingleton GetInstance()
{
return _instance;
}
}
public class Test
{
void static Main(string[] args)
{
UnitySingleton.GetInstance();
}
}
脚本需要提前挂到物体上,在Awake
方法中获得单例对象,后面就可以通过GetInstance
方法得到单例对象。
结束语
喜欢Unity
的同学,不要忘记点击关注,如果有什么Unity
相关的技术难题,也欢迎留言或私信~
原文地址:https://blog.csdn.net/linxinfa/article/details/115317134
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。