LabVIEW单例模式
单例模式

在编程开发中,需要保证一个类只有一个实例,并且提供一个全局访问此实例的点,通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
1.1 简单实现
使用FGV进行判空后,生成该对象,FGV自带全局锁,在一个程序中不能同时执行一次,而且有寄存器把生成的对象保存,防止数据克隆。

使用FGV,先判断内存中是否已经有对象,如果有直接使用该对象,如果为空创建该类,并将该类存储到FGV中,2025软件中可以使用map,map的优势是可以存储不同的对象,对于数组需要进行类型转换,需要进行类型的判断及转换。

SET中生成新对象,将数据插入数组中。

测试
双循环中,一个循环写递增数据ID,另一个循环读取ID,实际运行效果为获取到上面循环中的ID,并且能对应上。对该方法进行升级,可以传入CAN信息,队列Message,事件信息等等,可以实现不同循环之间的通讯,也可以使用信号锁,将类实现锁机制,减少程序对CPU的负担。

上面代码写入的ID号可以在另一个循环中读取到,使用单例模式可以在不同循环内传递数据
优化(双重锁机制)
VI变为可重用,用一个全局数组或者新版LABVIEW中的MAP,创建一张只有一个类只能在MAP中出现一次的表,每次执行前先判定是否有对应的对象,使用Labview的信号锁功能锁住生成对象的VI,此时再判定对应类是否为空,空则生成新的对象,非空则直接获取MAP中的对象。
优化(信号锁)
使用信号锁功能,将生成类函数上一把锁,相当于只要有一个进行访问就给该VI上锁,直到生成对象或者获取对象后释放该锁。同样也实现了单例结果。
1.2 使用内存控制函数,保证在LABVIEW使用的内存中只创建一份对象
数据引用可以将对象限定只生成一个,在整个程序的生命周期中数据不会产生竞争。其中也使用了工厂模式用来生产不同的对象


使用场景
- 数据库连接池中的连接不需要反复创建
- 代码中需要设置一些全局的属性
- 使用类传递数据
- 需要频繁创建销毁的对象(如日志工具)。
实战项目
配置管理器
,配置信息需要全局唯一且线程安全地访问。单例模式能确保所有模块读取同一份配置。
数据库连接池
高并发场景下,数据库连接池必须保持单例以避免资源浪费。
生成序列号
对一个产品生成唯一的序列号,将该对象再存储到数据库或者文件中。
注意事项
- 避免滥用单例模式,仅在真正需要全局唯一实例时使用
- 考虑依赖注入框架替代硬编码的单例
- 分布式系统中需要特殊处理(如使用Redis实现全局单例)
- 单元测试时注意单例状态污染问题
更多推荐
所有评论(0)