以下是一个简单的C#实现Unity中单例模式的例子:
public class SingletonClass : MonoBehaviour
{
private static SingletonClass _instance;
public static SingletonClass Instance
{
get
{
if (_instance == null)
{
// 如果实例不存在,则查找场景中已有的SingletonClass组件并将其设置为_instance
_instance = FindObjectOfType<SingletonClass>();
// 如果没有找到实例,创建一个新的GameObject挂载SingletonClass脚本并设置为_instance
if (_instance == null)
{
var singletonObject = new GameObject();
_instance = singletonObject.AddComponent<SingletonClass>();
singletonObject.name = nameof(SingletonClass);
DontDestroyOnLoad(singletonObject); // 保持单例在整个应用生命周期内不被销毁
}
}
return _instance;
}
}
protected SingletonClass() {}
private void Awake()
{
// 如果_instance尚未初始化,并且当前对象不是_instance(即第一次Awake调用)
if (_instance == null && this != _instance)
{
// 设置当前对象为_instance
_instance = this;
// 防止切换场景时该单例对象被销毁
DontDestroyOnLoad(gameObject);
}
else if (this != _instance) // 若_instance已存在但不是当前对象,则销毁多余的实例
{
Destroy(gameObject);
}
}
}
在C#中,protected SingletonClass() {}
这个构造函数的作用是限制类的实例化方式。在这个单例模式实现中,将构造函数设为 protected
有以下几点意义:
防止外部直接创建实例:由于构造函数是受保护的(protected),所以其他类无法通过 new SingletonClass()
的方式直接实例化该类。这样确保了只有单例类自己内部才能创建实例。
允许子类继承:尽管外部不能直接实例化,但这个构造函数对子类仍然是可见的。这意味着如果将来需要基于 SingletonClass
创建派生类,子类可以通过 base()
调用基类的构造函数进行初始化。
符合单例设计原则:在单例模式中,我们希望控制类的实例化过程,以确保在整个应用程序中只有一个实例存在。通过将构造函数设为 protected,并提供一个公共静态属性或方法来获取单例实例,可以确保这一目标得以实现。
因此,在上面的Unity单例模式实现中,protected SingletonClass() {}
构造函数是为了配合单例模式的实现策略,限制实例化权限,保证全局唯一性。
在上述代码中,SingletonClass
类遵循单例模式原则,确保无论何时何地访问 SingletonClass.Instance
,返回的都是同一个实例。同时,为了防止场景切换时该单例对象被销毁,我们使用了 DontDestroyOnLoad
方法。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
?最后我们放松一下眼睛