文章

单例模式

单例模式

单例模式

00 前言

关于单例的介绍摘抄如下:

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

应用实例:

  • 1、一个班级只有一个班主任。
  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

01 具体实现方法

01.1Mono的单例

父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static T _instance;
    public static T instance
    {
        get
        {
            if (_instance==null)
            {
                Debug.Log(typeof(T).ToString()+"is Null");
                // Do Something
            }
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        _instance = this as T;
    }

}

继承:

1
2
3
4
public class SkillPreviewerDataManager : MonoSingleton<SkillPreviewerDataManager>
{
    //Do Something
}

01.2 非Mono的单例

  1. 首先,写一个基类,脚本如下:

    img

  1. 修改XXXManager脚本,修改后的脚本如下:

    img

02 用法

比如通过一个单例去统一管理一些需要读取数据的类. 然后其他脚本通过这个单例去访问这些类里面的数据, 而不用每一个类都写一个单例. 例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class SkillPreviewerDataManager : MonoSingleton<SkillPreviewerDataManager>
{
    public LuaEffectLoader luaEffectLoader = new LuaEffectLoader();
    public LuaSkillLoader luaSkillLoader = new LuaSkillLoader();

    protected override void Awake()
    {
        base.Awake();
    }
    void Start()
    {
        luaEffectLoader.GetData();
        luaSkillLoader.GetData();
        luaEffectLoader.Check();
        luaSkillLoader.Check();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    
    private void OnDestroy()
    {
        // 释放LuaEnv
        luaEffectLoader.Dispose();
        luaSkillLoader.Dispose();
    }
}
参考网页

单例模式 | 菜鸟教程 (runoob.com)

Unity中的单例方法 - Dean二十七 - 博客园 (cnblogs.com)

Unity里滥用单例模式有弊端吗? - 知乎 (zhihu.com)

本文由作者按照 CC BY 4.0 进行授权