单例模式
可以说最常见的一种设计模式了,也经常会出现在面试中
特点:简单,但是包含线程安全,内存模型,类加载机制等知识点
单例模式是什么,为什么需要单例模式?
单例模式:顾名思义,就是在运行时一个类只有一个实例对象。
有的类比较庞大和复杂,而且完全可以复用,这个时候就需要使用单例模式来避免重复的实例化对象来产生性能的浪费。
而在游戏开发中,单例模式经常是用来写一些管理类,管理UI界面,音效等等
更比如,人物从第一个场景到第二个场景,如何继承血量,装备等信息?(下一篇讨论)
简单的代码演示,先演示继承mono的单例
1.创建一个脚本UIManager,为单例模式
public class UIManager : MonoBehaviour
{
public static UIManager instance;//全局访问得用static修饰
private void Awake()
{
instance = this;//这个脚本挂载在任意对象上,实例就是脚本本身,即挂载后立即创建单例
}
//在在单例中添加一个方法演示调用
public void Test()
{
Debug.Log("Mono单例中的方法执行了");
}
}
2.创建一个Test脚本调用单例
public class Test1 : MonoBehaviour
{
void Start()
{
UIManager.instance.Test();
}
}
将两脚本都挂在摄像机上,开始游戏,console窗口显示
演示不继承mono的单例,用C#传统的写法
因为不继承mono,此脚本不能挂载在对象上,只需要放在Asset下即可。
1.创建一个脚本UIManager2,为单例模式
public class UIManager2
{
private static UIManager2 instance2;//用private修饰,然后用get方法访问
public static UIManager2 Instance2
{
get
{
if (instance2 == null) //空的话就创建一个,在真正需要实例的时候创建
{
instance2 = new UIManager2();
}
return instance2;
}
}
public void Test()
{
Debug.Log("没有继承mono的单例中的方法执行了");
}
}
2.修改Test脚本调用单例
public class Test1 : MonoBehaviour
{
void Start()
{
UIManager.instance.Test();
UIManager2.Instance2.Test();
}
}
开始游戏,console窗口显示
另外:
对于单例模式有三个问题,需要遇到具体问题具体分析
1.是不是线程安全(多个线程同时调用,可能创建多个实例)
2.是不是懒加载(实例对象是第一次被调用时才真正创建,在不知道这个对象是否需要被真正调用时的情况下,这种方式比较合理)
3.能不能通过反射破坏
在下一篇文章讨论,如何实现人物从第一个场景到第二个场景,继承血量,装备等。