3. 单例模式唯一性问题—构造函数

1. 构造函数带来的唯一性问题指什么?

  1. 对于不继承MonoBehaviour的单例模式基类
    我们要避免在外部 new 单例模式类对象

例如 (完整单例模式定义在上一节)

csharp 复制代码
public class Main : MonoBehaviour
{

    void Start()
    {
        // 破坏单例模式的唯一性,可以自己new对应的单例模式类对象,这样不安全
        TestMgr t = new TestMgr();
        BaseManager<TestMgr> baseManager = new BaseManager<TestMgr>();

        
    }

}
  1. 对于继承MonoBehaviour的单例模式基类
    由于继承MonoBehaviour的脚本不能通过new创建,因此不用过多考虑

2. 解决构造函数带来的安全问题

解决BaseManager baseManager = new BaseManager();问题

  1. 父类变成抽象类

解决 TestMgr t = new TestMgr();问题

  1. 规定继承单例模式基类的类必须显示实现私有无参构造函数
  2. 但是会出现单例模式基类不能通过new问题创建实例

  3. 解决办法:在基类中通过反射来调用私有构造函数实例化对象
csharp 复制代码
public abstract class BaseManager<T> where T : class/*,new()*/
{
    public static T instance;

    // 属性的方式
    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                //instance = new T();

                // 利用反射得到无参私有的构造函数,来用于对象的实例化
                Type type = typeof(T);
                //  BindingFlags.Instance | BindingFlags.NonPublic, //表示成员私有方法
                //    null,                                         //表示没有绑定对象
                //    Type.EmptyTypes,                              //表示没有参数
                //    null);                                        //表示没有参数修饰符
                ConstructorInfo info =  type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null,Type.EmptyTypes,null);

                if(info != null)
                {
                    instance = info.Invoke(null) as T;
                }
                else
                {
                    Debug.LogError("没有得到对应的无参构造函数");
                }
                
            }
            return instance;
        }
    }

    
}
  1. 这样就实现了外部不能new单例模式的对象,同时,单例模式的基类通过反射获取到构造函数创建实例
相关推荐
武子康12 分钟前
Java-144 深入浅出 MongoDB BSON详解:MongoDB核心存储格式与JSON的区别与应用场景
java·开发语言·数据库·mongodb·性能优化·json·bjson
聪明的笨猪猪13 分钟前
Java Spring “事务” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
爱喝水的鱼丶21 分钟前
SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM
运维·开发语言·学习·sap·abap
小此方38 分钟前
C语言自定义变量类型结构体理论:从初见到精通(上)
c语言·开发语言
努力也学不会java43 分钟前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
java·开发语言·python·机器学习
lingggggaaaa44 分钟前
小迪安全学习笔记(一百零二讲)—— 漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
笔记·学习·安全·网络安全·交互
君莫愁。1 小时前
【Unity】构建超实用的有限状态机管理类
unity·c#·游戏引擎·有限状态机
vxtkjzxt8881 小时前
自动化脚本矩阵运营
开发语言·php
王严培.1 小时前
7.MATLAB疑难问题诊疗的技术
开发语言·matlab·信息可视化
wjs20241 小时前
PHP MySQL 使用 ORDER BY 排序查询
开发语言