单例模式

在这里插入图片描述
在编程开发中,需要保证一个类只有一个实例,并且提供一个全局访问此实例的点,通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

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使用的内存中只创建一份对象

数据引用可以将对象限定只生成一个,在整个程序的生命周期中数据不会产生竞争。其中也使用了工厂模式用来生产不同的对象
在这里插入图片描述
在这里插入图片描述

使用场景
  1. 数据库连接池中的连接不需要反复创建
  2. 代码中需要设置一些全局的属性
  3. 使用类传递数据
  4. 需要频繁创建销毁的对象(如日志工具)。

实战项目

配置管理器

,配置信息需要全局唯一且线程安全地访问。单例模式能确保所有模块读取同一份配置。

数据库连接池

高并发场景下,数据库连接池必须保持单例以避免资源浪费。

生成序列号

对一个产品生成唯一的序列号,将该对象再存储到数据库或者文件中。

注意事项

  1. 避免滥用单例模式,仅在真正需要全局唯一实例时使用
  2. 考虑依赖注入框架替代硬编码的单例
  3. 分布式系统中需要特殊处理(如使用Redis实现全局单例)
  4. 单元测试时注意单例状态污染问题
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐