用Singleton守护资源?

Dat*_*Chu 9 c++ singleton design-patterns

我已经阅读了不少博客文章和答案,指出Singleton是一个糟糕的设计.以前我实现了一个单独的CameraControl类.该类控制连接到系统的摄像机.根据以下知识:

  • 在任何情况下都不会有一台摄像机(摄像机制造商提供的摄像机API控制所有摄像机).
  • 同时在多个地方使用相机制造商的API在过去引起了问题(例如,一个线程试图抓取图像,另一个线程试图设置快门速度).
  • 我的类只提供了几种额外的方法来显示UI中捕获的图像.将图像转发到面部检测器,...(即,它不是内存密集型的).

我选择让这个班级成为单身课程是一个糟糕的决定吗?

Jol*_*hic 6

单身人士被认为是一种气味,因为:

  • 它们是全局变量的道德等价物,因此它们的使用隐藏了代码中的依赖性,而不是通过接口来揭示它们.

  • 它们促进了紧耦合,因为您的代码依赖于特定类型的特定实例.如果您希望某天的UI能够针对不同的摄像头管理器进行操作,该怎么办?

  • 它们使单元测试变得困难,因为它们在程序的整个生命周期中都带有状态.当状态从测试到测试时,它可以使测试状态依赖,这是一个非常大的气味.


Jam*_*nze 2

你可以读任何东西,迟早。不管有些人怎么说,没有根本原因反对在适当的情况下使用单例_。就你的情况而言,我有严重的怀疑,至少从你描述的方式来看是这样。无论相机制造商使用什么 API(可能是 C 语言),您的客户端代码都希望将每个单独的相机视为一个单独的对象,并且相机没有任何固有的独特性。

如果相机制造商的 API 使用 C 语言,并且您决定为其提供一个轻量级 C++ 包装器,以供您的 Camera 类(独占)使用,则单例在这里可能是合适的。这种轻量级包装器是单例的一种合法用途——世界上不可能在代码中拥有该库的多个实例。(不过,通常情况下,让 Camera 类直接处理 API,并跳过中间包装器会更容易。)