设计模式-单例模式(Singleton)
定义
“确认类只有一个对象,并提供一个全局的方法来获取这个对象。”
实现
单例模式在实现时,需要程序设计语言的支持,只要具有静态类属性、静态类方法和重新定义类构造函数存取层级(构造函数支持变更为private);
实现思路需要确认两点,也是定义中的两点:
(1) 同一时间只能存在一个对象;
(2)提供一个快速获取这个对象的方法;
代码
using UnityEngine;
//单例模式-继承mono的写法
public class Singleton_UnitTest : MonoBehaviour {
public static Singleton_UnitTest Instance;
void Awake()
{
Instance = this;//需要在Awake里赋值,由于Unity中Awake()函数的运行顺序逻辑,可以保证其他地方引用时不会遇到空引用;
}
}//直接使用"Singleton_UnitTest.Instance"就可以取到该单例
//单例模式-不继承mono写法
public class Singleton
{
//私有属性的构造函数-!重要!,防止在类外可以新创建此类的实例
private Singleton()
{
}
private static Singleton _instance;
public static Singleton Instance//利用属性访问器来实现只创建一次Singleton的对象
{
get
{
if (_instance == null)
{
_instance = new Singleton();//只有Singleton本身才能调用自身的构造函数,可以保证只在此处调用过一次来产生单例对象
}
return _instance;
}
}
}//直接使用"Singleton.Instance"就可以取到单例
这里使用了两种方法实现单例,
前一种是在unity中继承mono的写法;
后一种是在c#中使用属性访问器来实现单例的写法;
小结
- 单例模式通过将”类的构造函数私有化“,让类的对象只能在该类中产生,达到有效的控制对象的产生数量的目的,再配合”静态成员属性“来达到可以快速获取这个对象;
- 单例类要避免滥用
单例模式好用在于可以方便的获取对象,不必“设置引用”和“传递对象”,但这样容易引起单例的滥用,单例模式违反了“开闭原则OCP”,获取的对象是“实现类”而不是“接口类”,当设计变更或需求增加时,无法将其代替为其他类,修复复杂且麻烦,只能更改原有实现类,也无法满足对“修改关闭”的要求;