简介
单例模块是 IF框架中 支持的一种设计模式。简单好用。你只需要继承MonoSingleton<T>
,就可以实现一个单例模式,除此之外不需要写一行代码。
IF框架中的单例模块简单使用
该模块就是单例模式的实现。 相信能看这篇文章的人都清楚 设计模式是什么。
单例模式比较简答,直接看 IF框架中 的使用代码吧:
using UnityEngine;
using IFramework; //引入IF框架的空间
// MonoSingleton<T> 是IF 框架中 定义所有单例的父类。 只要继承它,该类就可以实现单例模式。
public class MySingle:MonoSingleton<MySingle>{
public void TestFunc(){
Debug.Log("测试:单例……");
}
}
public class QkuangSingle : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
MySingle.Instance.TestFunc();
SingletonPool.Dispose<MySingle>(); //专门用来管理 单例的池子。调用Dispose方法,可以将“MySingle”的单例移除。
}
}
输出:
MonoSingletonPath特性——单例可见,管理安心
利用IF 框架实现的单例类型,如果该类型拥有
MonoSingletonPath
特性,那么会在 创建 实例时被检测出来。同时在Hierarchy 面板中 ,按照对应层级实例化游戏物体。让单例对象 可见!管理更安心!!
代码如下:
using UnityEngine;
using IFramework; //引入IF框架的空间
[MonoSingletonPath("Qkuang/mySingleGameObject")]
public class MySingle:MonoSingleton<MySingle>{
public void TestFunc(){
Debug.Log("测试:单例……");
}
}
public class QkuangSingle : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
MySingle.Instance.TestFunc();
// SingletonPool.Dispose<MySingle>(); // 为了观察效果,不要删除 单例。
}
}
效果图:
作者补充——实现状态形单例
单例模式,实现起来很简单。但是不建议 经常使用。提供的全局访问点,有利有弊。同理,设计模式不能乱用,学设计模式重要的是学其中的思维,而非“形式”。
当你决定要实现一个单例模式 时。你是否考虑过 不论是“饱汉”还是“饿汉”单例,第一次 需要判断是否为空,然后构造实例。后面都不需要再判断 为空。否则,除非单例被销毁,否则单例对象一直存在。
其实这就是两个状态的来回切换。
既然有了想法,那么,安排!
public class Single{
protected static Single instance;
protected static Single Stay = new SingleNull();
protected virtual Single Instance{get;}
public static Single singleInstance =>Stay.Instance;
}
public class SingleNull : Single
{
protected override Single Instance {
get{
// 未考虑线程安全,如果需要,请自加
Single.instance = new Single();
Single.Stay = new SingleValue();
return Single.instance;
}
}
}
public class SingleValue : Single
{
protected override Single Instance => Single.instance;
}
什么?没有适用性?安排!
public class Single<T>
{
protected static T instance;
protected static Single<T> Stay = new SingleNull<T>();
protected virtual T Instance { get; }
public static T singleInstance => Stay.Instance;
}
public sealed class SingleNull<T> : Single<T>
{
protected override T Instance
{
get
{
Console.WriteLine("初始化");
// 未考虑线程安全,如果需要,请自加
Single<T>.instance = System.Activator.CreateInstance<T>();
Single<T>.Stay = new SingleValue<T>();
return Single<T>.instance;
}
}
}
public sealed class SingleValue<T> : Single<T>
{
protected override T Instance => Single<T>.instance;
}
public sealed class AudioManage : Single<AudioManage>
{
// 注意这里:由于不调用,就不会实例化。所以本代码是 “饿汉”单例
public static AudioManage audioInstance = singleInstance;
public void TestFunc()
{
Console.WriteLine("单例测试");
}
}
public class Program
{
public static void Main(string[] prag)
{
Console.WriteLine("******");
AudioManage.audioInstance.TestFunc();
Console.WriteLine("******");
AudioManage.audioInstance.TestFunc();
}
}
如果你想 使用单例,请一定要使用IF框架,因为它使用起来非常不错。
结尾
以上内容是 作者个人的理解,如有错误,欢迎指出。
顺便给出OnClick大佬自己 写的文档地址:003单例模块
如果对 IF框架有其他看法,也欢迎大家 进群交流。
网友评论