怎么样在网站文章最后做超链接,做脚本网站,西安 h5网站建设,手机传奇网站单例模式基类
构造函数私有化#xff0c;防止外部创建对象
提供一个属性给外部访问#xff0c;这个属性就相当于是这个类的唯一对象
分为懒汉模式和饿汉模式
不继承MonoBehaviour的单例模式 public static MyUiManager Instance {get{if (instance null){instance new …单例模式基类
构造函数私有化防止外部创建对象
提供一个属性给外部访问这个属性就相当于是这个类的唯一对象
分为懒汉模式和饿汉模式
不继承MonoBehaviour的单例模式 public static MyUiManager Instance {get{if (instance null){instance new MyUiManager();}return instance;}}
继承MonoBehaviour的单例模式
public class MyUiManager : MonoBehaviour
{private MyUiManager() { }private static MyUiManager instance;public static MyUiManager Instance {get{if (instance null){instance FindObjectOfTypeMyUiManager();}return instance;}}
} instance FindObjectOfTypeMyUiManager(); 继承 MonoBehaviour 的单例是会挂在游戏场景上的需要在游戏场景身上寻找到然后赋值
继承与不继承两者初始化的方式不同
继承MonoBehaviour的自动单例模式
if (instance null){instance FindObjectOfTypeMyUIManager();//游戏场景中没有创建物体挂在脚本写代码来自动做这些事情if (instance null){GameObject go new GameObject(MyUIManager); //创建游戏对象instance go.AddComponentMyUIManager(); //挂载脚本到游戏对象身上}} 继承MonoBehaviour的单例模式切换场景的问题
if (instance null){GameObject go new GameObject(MyUIManager); //创建游戏对象instance go.AddComponentMyUIManager(); //挂载脚本到游戏对象身上}DontDestroyOnLoad(instance); //让游戏对象切换场景时不销毁
不继承MonoBehaviour的单例模式基类
/// summary
/// 不继承MonoBehaviour 的单例模式基类
/// 作用继承了这个这个类的类自带单例模式
/// /summary
public class SingletonPatternBaseT where T: SingletonPatternBaseT
{private static T instance;public static T Instance{get{if (instance null){//where 里面要求含有无参构造函数 where T :new()//....单例怎么能有无参构造函数呢//instance new T();//或者利用反射调用无参构造方法来构造instance Activator.CreateInstance(typeof(T), true) as T;}return instance;}}//构造方法私有化 private 的话子类也无法继承对象所以使用protectedprotected SingletonPatternBase() { }}
继承MonoBehaviour的单例模式基类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SingletonMonoAutoBaseT : MonoBehaviour where T:MonoBehaviour
{protected SingletonMonoAutoBase() { }private static T instance;public static T Instance{get{if (instance null){instance FindObjectOfTypeT();if (instance null){GameObject go new GameObject(typeof(T).Name); //创建游戏对象instance go.AddComponentT(); //挂载脚本到游戏对象身上}}return instance;}}
}继承MonoBehaviour的单例模式基类切换场景问题
OnDestroy方法中访问单例对象的问题
OnDestroy 方法执行的时候资源会清空instance 检测为空自动生成新对象所以报错
解决办法 //记录单例对象是否存在用于防止OnDestory方法中访问单例对象报错 public static bool isExisted { get; private set; } false; protected virtual void OnDestroy() { isExisted false; } 多线程访问单例时会遇到的问题 操作系统 线程锁问题
//线程锁。当多线程访问时同一时刻只允许一个线程访问private static object locker new object();//volatile关键字修饰的字段当多个线程都对它进行修改时可以确保这个字段在任何时刻呈现的都是最新的值private volatile static T instance;public static T Instance{get{if (instance null){lock(locker){if (instance null){//或者利用反射调用无参构造方法来构造instance Activator.CreateInstance(typeof(T), true) as T;}}}return instance;}}