跳转至

单例模式(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. 应用场景#

场景 说明
全局计数器 所有窗口共享同一个计数对象
配置文件管理 全局只读一份配置
数据库连接 全局共用一个连接
游戏分数 各界面共享同一份数据

💡 学习阶段掌握「私有构造 + 静态实例 + 静态方法」三步即可,这是最经典的懒汉式单例。


相关笔记#