如何使用单例模式保证全局唯一实例(复杂版本)

/// 
/// 登录管理类(单例模式),负责用户登录、注销及用户信息管理
/// 
public class LoginMananger
{
    // 用于线程同步的锁对象
    static object _lockObj = new object();

    // 单例实例(延迟初始化)
    static LoginMananger loginMananger = null;

    // 用户数据库操作帮助类
    ELMeasure.Model.UserSqlHelp userSql;

    /// 
    /// 当前登录用户信息(只读属性)
    /// 
    public UserInfo LoginUser { get; private set; }

    /// 
    /// 私有构造函数(防止外部实例化)
    /// 
    private LoginMananger()
    {
        // 初始化默认用户状态
        LoginUser = new UserInfo() { Name = "未登录", Level = Model.RootLevel.None };
        
        // 创建数据库连接帮助类并建立连接
        userSql = new ELMeasure.Model.UserSqlHelp();
        userSql.Connect();
    }

    /// 
    /// 获取单例实例(线程安全)
    /// 
    /// LoginMananger的唯一实例
    public static LoginMananger GetInstance()
    {
        lock (_lockObj)  // 加锁确保线程安全
        {
            if (loginMananger == null)
                loginMananger = new LoginMananger();  // 延迟初始化
        }
        return loginMananger;
    }

    /// 
    /// 用户登录验证
    /// 
    /// 用户名
    /// 密码
    /// 登录成功返回true,否则返回false
    public bool Login(string user, string password)
    {
        if (userSql.IsConnected)  // 检查数据库连接状态
        {
            // 查询用户信息
            if (userSql.SelectUser(user, password, out UserInfo info))
            {
                // 更新当前登录用户信息
                LoginUser.Name = info.Name;
                LoginUser.Level = info.Level;
                return true;
            }
            else
                return false;  // 用户验证失败
        }
        else
            return false;  // 数据库未连接
    }

    /// 
    /// 用户注销
    /// 
    public void LoginOut()
    {
        if (LoginUser.Level != Model.RootLevel.None)
        {
            // 重置用户状态为未登录
            LoginUser.Name = "未登录";
            LoginUser.Level = Model.RootLevel.None;
        }
    }

    /// 
    /// 添加新用户
    /// 
    /// 用户信息
    /// 操作成功返回true
    public bool AddUser(UserInfo userInfo)
    {
        return userSql.AddUser(userInfo);
    }

    /// 
    /// 删除用户
    /// 
    /// 要删除的用户信息
    /// 操作成功返回true
    public bool DeleteUser(UserInfo userInfo)
    {
        return userSql.DeleteUser(userInfo);
    }

    /// 
    /// 修改用户信息
    /// 
    /// 修改后的用户信息
    /// 操作成功返回true
    public bool ChangeUser(UserInfo userInfo)
    {
        return userSql.ChangeUser(userInfo);
    }

    /// 
    /// 获取所有用户列表
    /// 
    /// 用户列表
    public List SelectUser()
    {
        List users = null;
        userSql.SelectUsers(out users);
        return users;
    }
}

这样做有什么好处?

 

  1. 单例模式实现

    • 通过私有构造函数 + GetInstance() 方法保证全局唯一实例

    • 使用 lock 确保多线程安全

  2. 核心功能

    • Login():验证用户凭据并更新登录状态

    • LoginOut():清除当前登录状态

    • 用户管理方法(Add/Delete/Change/Select)

  3. 状态管理

    • LoginUser 属性记录当前登录用户

    • 初始状态为"未登录"

  4. 数据库依赖

    • 通过 UserSqlHelp 类封装所有数据库操作

    • 在构造函数中初始化数据库连接

  5. 线程安全

    • 所有对单例实例的访问都通过加锁保护

你可能感兴趣的:(如何使用单例模式保证全局唯一实例(复杂版本))