Skip to content

单例模式

确保一个类在全局中只有一个实例,并且提供一个访问它的方 式。

适合的场景

  • 配置管理器(ConfigManager)

  • 游戏中的全局状态(GameManager)

  • UI控制(UIManager)

  • 音效/音乐控制(SoundManager)

这些东西通常全局只需要一个就够了,

不但避免浪费资源,也让逻辑更集中、易管理。

反之,如果每次都创建一个新实例,很快就会逻辑混乱

基本结构

  1. 类有一个私有的静态变量保存唯一实例。

  2. 构造函数是私有的,外部不能直接 new

  3. 提供一个公开的静态方法或属性来获取实例(通常叫 Instance)。

示例

csharp
public class Singleton
{
	// 静态只读实例
	private static readonly Singleton _instance = new Singleton();

	// 构造函数私有,防止外部new
	private Singleton()
	{
		Console.WriteLine("构造了一个Singleton!");
	}

	// 提供全局访问点
	public static Singleton Instance => _instance; 

	public void DoSomething()
	{
		Console.WriteLine("单例在执行操作");
	}
}

// 使用
Singleton.Instance.DoSomething();

注:这并不是单例模式在 Godot 中的最佳实践, 在 Godot 中我们通常使用 Autoload,更符合引擎习惯

(详见 实战系列-游戏编程设计模式 章节)

gdscript
class Singleton:

	static var instance: Singleton:
		get: return _instance

	static var _instance: Singleton = new()
	
	func do_something():
		print("正在执行操作")
	
# 使用
func _ready():
	Singleton.instance.do_something()

这种方式更接近传统OOP的写法,但在 Godot 中通常不会这么搞,

因为 Autoload 更加方便灵活