1、本片文章是保存单例模式的相关介绍用于自身理解,文章内容引自他人博客。
原文点击:
(1)https://blog.csdn.net/qq_15267341/article/details/54232854?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2
(2)https://blog.csdn.net/qq_36238093/article/details/89562160
一、单例模式
1、单例模式介绍:单例模式,简单说就是类的实例在内存中只存在一份;
1.1、第一种:Unity中继承MonoBehaviour下的单例
1.1.1、写一个脚本,然后将这个脚本拖放到场景中某个对象身上,千万注意只拖一次到场景中,我们知道,一旦将脚本托给场景中某个对象,就变成脚本组件,组件就是对象,因此这个类的实例在场景中有且只有一个,因此从某种意义上讲场该脚本组件也就是单例的
1.1.2、访问此种单例的方式有两种
1. 可以通过getComponent方式
2 .游戏中,经常为了获取方便,比较易用的方式如下(xuhaitao.instance),使用这种方式要注意三点,在场景中有且只有一个该类的脚本组件
3.该脚本组件所依附的对象在场景中必须是激活的,否则会报空指针异常,最后一点是要将instance=this这样代码放在Awake函数中不要放在Start函数中:
using UnityEngine; public class Singleton : MonoBehaviour { //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象 private Singleton() { } public static Singleton instance; //创建实例对象, void Awake () { instance = this; //需要在Awake中加入instance = this;
} }
1.2、C#单例的实现
1.2.1、饿汉模式
public class Singleton { //很饿,启动时就创建单例对象 private static Singleton _instance=new Singleton(); //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象 private Singleton() { } //得到单例对象 public static Singleton Instance { get { return _instance; } } }
注:饿汉模式在程序启动的时候就会创建一个Singleton对象,程序运行中,调用Singleton.Instance直接得到一开始创建的对象。
1.2.2、懒汉模式
public class Singleton { //很懒,启动时不创建单例对象。 private static Singleton _instance; //私有化构造方法,不能new对象,只能通过Singleton.instance的方法得到对象 private Singleton() { } //得到单例对象 public static Singleton Instance { get { //判断_instance是否为空,为空时是第一次调动该方法。创建Singleton对象返回,不为空 //说明不是第一次进入。返回上一次创建的对象。当两个线程同时第一次进入这里,会都判断到 //_instance为空,而创建两个Singleton对象返回。所以时线程不安全的。 if (_instance== null) { _instance= new Singleton(); } return _instance; } } }
注:懒汉模式在程序启动的时候并不会创建Singleton对象。程序运行中,调用Singleton.Instance会判断_instance是否为空。如果为空,就创建一个返回。如果不为空,说明之前已经创建过了,返回它就完事儿了