当前位置: 首页 > news >正文

WPF中viewmodel单例模式

1、单例模式介绍

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。它常用于需要全局唯一访问点的场景,如配置管理、日志记录、数据库连接等。

2、WPF 中 ViewModel 的单例实现

在 WPF 中,ViewModel 通常用于实现 MVVM 模式。下面是一个简单的 ViewModel 单例实现示例:

using System.ComponentModel;

// 实现 INotifyPropertyChanged 接口,用于数据绑定通知
public class MainViewModel : INotifyPropertyChanged
{
    // 定义静态私有字段,用于存储单例实例
    private static MainViewModel _instance;
    // 用于线程安全的锁对象
    private static readonly object _lock = new object();

    // 私有构造函数,防止外部实例化
    private MainViewModel()
    {
        // 可以在这里进行初始化操作
    }

    // 公共静态属性,用于获取单例实例
    public static MainViewModel Instance
    {
        get
        {
            // 加锁确保线程安全
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new MainViewModel();
                }
                return _instance;
            }
        }
    }

    // 实现 INotifyPropertyChanged 接口的事件
    public event PropertyChangedEventHandler PropertyChanged;

    // 用于触发属性更改通知的方法
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _message;
    // 示例属性
    public string Message
    {
        get { return _message; }
        set
        {
            if (_message != value)
            {
                _message = value;
                OnPropertyChanged(nameof(Message));
            }
        }
    }
}    

3、适合使用单例模式的情况

  1. 全局状态管理:当多个视图需要共享同一个 ViewModel 实例的状态时,单例模式就很适用。例如,在一个具有多窗口的应用程序里,所有窗口都要显示和修改用户的登录状态,这时就可以把管理登录状态的 ViewModel 设计成单例。这样一来,无论在哪个窗口修改了登录状态,其他窗口都能获取到最新状态。
  2. 资源共享:如果 ViewModel 负责管理一些共享资源,像数据库连接、网络连接等,使用单例模式可以避免资源的重复创建和浪费。例如,在一个数据查询应用中,负责与数据库交互的 ViewModel 采用单例模式,就能确保整个应用程序只有一个数据库连接,从而减少资源开销。
  3. 频繁访问的数据:当某个 ViewModel 中的数据会被频繁访问,且数据的更新频率不高时,单例模式可以提高访问效率。因为每次访问时不需要重新创建 ViewModel 实例,减少了实例化和初始化的开销。

4、不适合使用单例模式的情况

  1. 视图独立性:若每个视图都需要独立的 ViewModel 实例来管理自己的状态,就不适合使用单例模式。例如,在一个包含多个商品详情页的电商应用中,每个商品详情页的 ViewModel 都应该是独立的,这样才能保证每个页面显示的商品信息互不干扰。
  2. 内存管理:单例模式的实例会一直存在于内存中,若 ViewModel 占用大量内存且不需要一直存在,使用单例模式可能会导致内存泄漏。例如,在一个图像处理应用中,负责处理大尺寸图像的 ViewModel 若采用单例模式,可能会使内存占用过高,影响应用性能。
  3. 测试难度:单例模式会增加单元测试的难度,因为单例实例的状态可能会影响不同测试用例的结果。在测试时,很难对单例 ViewModel 进行隔离测试,无法确保每个测试用例的独立性。

相关文章:

  • es-字段类型详解
  • 面基:为什么不推荐用UUID作为主键
  • 探索多种方案下 LLM 的预训练性能
  • Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析
  • C++26新特性解读: 结构化绑定作为条件
  • 在linux中GCC、Yum 与 Apt - get 的区别
  • OCRmyPDF 开源核弹
  • PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境
  • 【江协科技STM32】PWR电源控制(学习笔记)
  • 排序算法-插入排序
  • Tomcat深度解析:Java Web服务的核心引擎
  • Java 线程池与 Kotlin 协程 高阶学习
  • 子网划分2
  • OSPF五种数据包详解
  • FPGA实现LED流水灯
  • Leetcode 3500. Minimum Cost to Divide Array Into Subarrays
  • Spring IOC:容器管理与依赖注入秘籍
  • RK3568 pinctrl内容讲解
  • Python----机器学习(距离计算方式:欧式距离,曼哈顿距离,切比雪夫距离,余弦相似度,汉明距离,闵可夫斯基距离,Jaccard指数,半正矢距离)
  • 探索PHP的未来发展与应用趋势
  • 产假工资是谁出?女职工生育能领多少生育津贴?解答来了
  • 奥斯卡新规:评委必须看完影片再投票;网友:以前不是啊?
  • 美国第一季度经济环比萎缩0.3%,特朗普:怪拜登,与关税无关
  • 图忆|上海车展40年:中国人的梦中情车有哪些变化(上)
  • 经济日报社论:书写新征程上奋斗华章
  • 证监会副主席王建军被查