C#单例与继承MonoBehaviour的单例
2017-06-20 10:02
399 查看
单例模式是我们最常用的一种设计模式。
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节
4000
省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
首先是普通的C#单例模式
这里使用了范型类约束,当我们需要使用单例类时继承这个单例类就可以,这样就可以提高代码的复用性。
接下来是Unity中继承MonoBehaviour的单例类型,这里做法和第一种类似,同样使用继承单例类的方法来实现统一管理。
之后如果需要使用继承了MonoBehaviour的单例类型只需要继承MonoSingletion就可以
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节
4000
省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
首先是普通的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 initialization void Start () { } // Update is called once per frame void Update () { } }使用时只需要在其他地方调用 MusicSingletion.Instance.Show();就可以
相关文章推荐
- 如果你想让继承MonoBehaviour的类变成Singleten
- 关于继承MonoBehaviour的一些记录
- MonoBehaviour 编写C#
- 如何不绑定脚本且不继承MonoBehaviour做U3D的开发
- 继承MonoBehaviour的类是不可以实例化
- [置顶] 不继承MonoBehaviour的UI框架
- 在不继承MonoBehaviour的情况下单利的实现单利
- 如何不绑定脚本且不继承MonoBehaviour做U3D的开发
- Unity继承MonoBehaviour的静态单例
- [Unity&接口]子类即继承接口类也继承MonoBehaviour的快速操作和重构实现
- MonoBehaviour继承类及其重要方法
- 【Unity】脚本没有继承MonoBehaviour 如何使用Destroy
- 如果一个类是从MonoBehaviour继承,而迩又不把它放在场景的gameObject上,它的实例将会为空
- Unity3D中继承MonoBehaviour的类中会被引擎自动调用的方法
- 如何不绑定脚本且不继承MonoBehaviour做U3D的开发
- C#中的继承
- c#过程中遇到的关于构造函数和继承的问题
- 《C# 设计模式》笔记: 第5章 继承
- new更新C#继承中的虚函数
- C#学习笔记(六):继承