一、描述
最简单的设计模式,一个全局使用的类,避免频繁地创建与销毁。
二、优劣势
优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
三、需求
设计一个播放声音的功能。
四、不使用设计模式
都不考虑设计了,直接撸代码。
1个类,
AudioPlay.cs -声音播放器类
//声音播放器
public class AudioPlay
{
public void Play(string str)
{
Debug.Log("开始播放"+str);
}
}
//客户端某处1调用
public static void Start()
{
AudioPlay audioPlay = new AudioPlay();
audioPlay.Play("播放攻击音效");
}
//客户端某处2调用
public static void Start()
{
AudioPlay audioPlay = new AudioPlay();
audioPlay.Play("播放受伤音效");
}
小结:在客户端中每个需要播放声音的地方都需要new一个出来,浪费内存,还不方便调用。
五、使用设计模式
通过添加静态变量来直接获取类,如果没有获取到就生成一个,这样下次再获取就依旧还是这个。 该方式只能在单线程使用,多线程里多处同时引用会导致实话化多个对象。
1个类,
AudioManager -声音播放控制器类
//声音播放控制器类
public class AudioManager
{
private static AudioManager _instance;
public static AudioManager Instance
{
get {
if (_instance==null)
{
_instance = new AudioManager();
}
return _instance;
}
}
public void Play(string str)
{
Debug.Log("开始播放"+str);
}
}
//客户端某处1调用
public static void Start()
{
AudioManager.Instance.Play("播放攻击音效");
}
//客户端某处2调用
public static void Start()
{
AudioManager.Instance.Play(播放受伤音效);
}
小结:运用单例模式,在调用的时候就方便了许多,并且内存中最多存在一个该对象,一般喜欢加Manager的后缀命名。
六、设计图
通过学习,我们了解到了单例模式的应用,我们把刚刚的实现方式画出来。
七、进阶讲解
单例模式也分为很多种,像上面那个在多线程里多个线程同时访问会出现问题具体请看这个链接:
八、总结
一语道破:单例模式适合只能存在一个该类的情况下,比如游戏里我们的声音播放可以做成单例模式方便统一调用,像校长、总统这种只有一个的适合用单例模式。
觉得有用就留下评论吧^-^