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

embedded/2024/10/15 18:22:23/

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

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

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

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. 解决办法:在基类中通过反射来调用私有构造函数实例化对象
    在这里插入图片描述
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单例模式的对象,同时,单例模式的基类通过反射获取到构造函数创建实例
    在这里插入图片描述

http://www.ppmy.cn/embedded/128004.html

相关文章

护眼灯品牌排行第一名分享!看儿童护眼灯哪个牌子好

​中国到底有多少人患有近视&#xff1f;世界卫生组织此前的研究报告显示&#xff0c;中国近视患者人数多达6亿&#xff0c;青少年近视率居世界第一。中国已经成为世界第一近视大国。更令人担忧的是青少年——全国儿童青少年近视情况调查结果显示&#xff0c;我国儿童青少年总体…

conda 命令

目录 1. [Anaconda 简介](#anaconda-简介) 2. [安装 Anaconda](#安装-anaconda) - [Windows 系统](#windows-系统) - [macOS 系统](#macos-系统) - [Linux 系统](#linux-系统) 3. [启动 Anaconda Prompt](#启动-anaconda-prompt) 4. [环境管理](#环境-管理) - [创建新环…

【学习笔记】python

Python 1、 基础 1.1、基本数据类型 1.2、运算符 1.3、字符串基础 1.4、字符串扩展 1.5、函数 1.6、列表 1.7、元组 1.8、字符串 1.9、集合 1.10、字典 1.11、数据容器小结 1.12、bytes 类型2、 入门 2.1、文…

Electron + ts + vue3 + vite

正常搭建脚手架&#xff1a;npm create vitelatest 项目名称 安装electron的相关依赖&#xff1a;注&#xff1a;安装时终端url要项目名那一层 安装npm install electron -D安装打包工具&#xff1a;npm install electron-builder -D开发工具&#xff1a;npm install electron-…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

将Windows中的Anaconda环境复制到Linux中

Linux服务器有网络情况下安装 1.导出Windows环境的Anaconda包列表 导出环境配置到YAML文件中 conda env export > env.yml2.将YAML文件上传到Linux中 3. 在Linux中创建相同的Anaconda环境 conda env create -f env.ymlLinux服务器无网络情况下安装 使用conda-pack打包…

Shiro 认证(Authentication)

Shiro 简介 Shiro是Apache旗下的一个开源Java安全&#xff08;权限&#xff09;框架&#xff0c;它将软件系统的安全认证相关的功能抽取出来&#xff0c;实现用户身份认证、权限授权、加密、会话管理等功能&#xff0c;组成了一个通用的安全认证框架。以下是关于Shiro的详细介…

JS 怎么监听复制事件 并获取复制内容 并修改复制文本内容

需求背景&#xff1a; 需要禁用部分文本内容的复制事件&#xff0c;并且在复制事件发生时&#xff0c;将复制的文本内容通过接口传给后端。 上代码&#xff1a; // 使用Dom获取需要操作禁用时间的元素let element: any document.getElementById(test1);// 为该元素添加 copy 事…