美文网首页
单例模块

单例模块

作者: Qkuang | 来源:发表于2019-12-28 19:53 被阅读0次

    IF框架总目录

    简介

    单例模块是 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”的单例移除。
        }
    
    }
    

    输出:

    image.png

    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>();  // 为了观察效果,不要删除 单例。
            
        }
    
    }
    
    

    效果图:

    image.png

    作者补充——实现状态形单例

    单例模式,实现起来很简单。但是不建议 经常使用。提供的全局访问点,有利有弊。同理,设计模式不能乱用,学设计模式重要的是学其中的思维,而非“形式”。

    当你决定要实现一个单例模式 时。你是否考虑过 不论是“饱汉”还是“饿汉”单例,第一次 需要判断是否为空,然后构造实例。后面都不需要再判断 为空。否则,除非单例被销毁,否则单例对象一直存在。
    其实这就是两个状态的来回切换。

    既然有了想法,那么,安排!

     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框架有其他看法,也欢迎大家 进群交流。

    相关文章

      网友评论

          本文标题:单例模块

          本文链接:https://www.haomeiwen.com/subject/klzsoctx.html