单例模块

2019-12-28  本文已影响0人  Qkuang

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

上一篇下一篇

猜你喜欢

热点阅读