单例模式
单例模式
单例模式
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的单例
- 首先,写一个基类,脚本如下:
- 修改XXXManager脚本,修改后的脚本如下:
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();
}
}
参考网页
本文由作者按照 CC BY 4.0 进行授权

