C#单例与继承MonoBehaviour的单例

2024-04-23 00:38

本文主要是介绍C#单例与继承MonoBehaviour的单例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单例模式是我们最常用的一种设计模式。

主要优点:

1、提供了对唯一实例的受控访问。

2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

3、允许可变数目的实例。

 

主要缺点:

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。


首先是普通的C#单例模式

public abstract class CSharpSingletion<T> where T : new() {  private static T instance;  public static T Instance  {  get  {  if (instance == null)  {  instance = new T();  }  return instance;  }  }  }
using UnityEngine;  
using System.Collections;  public class AudioSingletion : CSharpSingletion<AudioSingletion> {  public int i = 1;  
}  

这里使用了范型类约束,当我们需要使用单例类时继承这个单例类就可以,这样就可以提高代码的复用性。


接下来是Unity中继承MonoBehaviour的单例类型,这里做法和第一种类似,同样使用继承单例类的方法来实现统一管理。

using UnityEngine;
using System.Collections;public class MonoSingletion<T> : MonoBehaviour where T :MonoBehaviour{private static string MonoSingletionName = "MonoSingletionRoot";private static GameObject MonoSingletionRoot;private static T instance;public static T Instance{get{if (MonoSingletionRoot==null)//如果是第一次调用单例类型就查找所有单例类的总结点{MonoSingletionRoot = GameObject.Find(MonoSingletionName);if (MonoSingletionRoot==null)//如果没有找到则创建一个所有继承MonoBehaviour单例类的节点{MonoSingletionRoot = new GameObject();MonoSingletionRoot.name = MonoSingletionName;DontDestroyOnLoad(MonoSingletionRoot);//防止被销毁}}if (instance == null)//为空表示第一次获取当前单例类{instance = MonoSingletionRoot.GetComponent<T>();if (instance == null)//如果当前要调用的单例类不存在则添加一个{instance = MonoSingletionRoot.AddComponent<T>();}}return instance;}}}


之后如果需要使用继承了MonoBehaviour的单例类型只需要继承MonoSingletion就可以


using UnityEngine;
using System.Collections;public class MusicSingletion : MonoSingletion<MusicSingletion> {public void Show(){Debug.Log("Play Music");}// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}
}

使用时只需要在其他地方调用 MusicSingletion.Instance.Show();就可以

这篇关于C#单例与继承MonoBehaviour的单例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927314

相关文章

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET