单例模式(Singleton)#
来源:
D:\study\C#1\WinForm\stu0812\stu0813\单例模式
设计模式:保证一个类只有一个实例,并提供全局访问点。多个类操作的都是同一份数据。
1. 问题场景#
// 普通类:new 一次就创建一个新对象,数据互不相通
Class1 one = new Class1();
Class2 two = new Class2();
// one 和 two 各自操作自己的数据
如果希望所有类共享同一份数据(比如全局计数器、共享配置),就需要单例模式。
2. 实现原理(三步)#
internal class Danli
{
int num = 100; // 共享数据
// 第 1 步:私有构造函数(禁止外部 new)
private Danli() { }
// 第 2 步:静态实例(全局只有这一个)
static Danli danli;
// 第 3 步:静态方法提供全局访问点(延迟初始化)
public static Danli GetDanli()
{
if (danli == null)
{
danli = new Danli(); // 第一次调用时才创建
}
return danli; // 之后每次都返回同一个
}
// 业务方法(操作共享数据)
public int Dan()
{
return --num;
}
}
3. 使用示例#
// 无论哪里调用 GetDanli(),拿到的都是同一个对象
Class1 one = new Class1(); // 内部调用 Danli.GetDanli()
Class2 two = new Class2(); // 内部也调用 Danli.GetDanli()
// one 和 two 内部的 danli 是同一个对象!
// 数据 num 是共享的:one 减一次,two 看到的 num 也变了
💡 要点:多个类通过
Danli.GetDanli()获取同一个实例,所有操作都共享同一份数据。
4. 单例三要素总结#
| 要素 | 作用 |
|---|---|
private 构造函数 |
阻止外部 new,保证不能随意创建 |
static 实例字段 |
全局只保存一份 |
public static 访问方法 |
统一获取入口(第一次才创建 = 延迟初始化) |
5. 应用场景#
| 场景 | 说明 |
|---|---|
| 全局计数器 | 所有窗口共享同一个计数对象 |
| 配置文件管理 | 全局只读一份配置 |
| 数据库连接 | 全局共用一个连接 |
| 游戏分数 | 各界面共享同一份数据 |
💡 学习阶段掌握「私有构造 + 静态实例 + 静态方法」三步即可,这是最经典的懒汉式单例。