2

所以我在 OO 设计方面比较新,我想知道单例设计模式的使用。我已经阅读了一些关于为什么单身人士不好但仍然无法弄清楚我是否需​​要单身人士的文章。我想尽可能地避免它。

就我而言,我使用 OceanOptics Spectrometers,可以通过他们的 API 用 C++ 控制和查询。

我已将管理光谱仪的所有代码(发现它们、设置或获取参数、检索数据)放在一个类SpectrometerProxy中。

我想知道这个类是否应该是单例。我觉得可能有几个理由可以证明它是合理的:

  • 它管理硬件

  • 无论光谱仪的数量是多少,都可以通过本课程进行控制和咨询

  • 有一个特定的程序必须以精确的顺​​序完成,并且只有一次(打开光谱仪,检查一些变量,并在程序停止时关闭光谱仪)

然后,我不知道是否有比使其成为单例更好的方法来实现这个类。我想到的另一个解决方案是将它保留为普通类,但防止复制(通过声明复制构造函数和赋值运算符私有)并且只是将指针传递给需要它的类:它不会阻止创建多个SpectrometerProxy我会喜欢避免这种情况。

我还想过将其全部设为静态,但随后它将依赖客户端代码以正确的顺序调用正确的静态成员函数(并且不要忘记正确关闭与光谱仪的连接),因此容易出错并且与 RAII 原则相反。

那么,单例是否可能是解决此问题的正确设计方法,还是应该排除它并寻找其他方法?

4

3 回答 3

4

这主要是一个宗教主题:使用或不使用单音。根据我使用硬件(10 年以上)的经验,我宁愿不使用它们。第一:正如墨菲定律所说,明天你需要使用不止一个光谱仪。第二:最好用你需要与硬件交互的方法创建一个虚拟抽象接口,从它继承并编写一个实际处理硬件的代码。当您无法访问硬件但需要调试您的应用程序时,这种方式非常有用。在这种情况下,您只需将该接口子类化并制作模拟函数(或更好的函数,即从先前记录的带有数据的文件中读取实际数据,从硬件获取),但程序的其余部分保持不变。

于 2013-05-13T10:04:14.483 回答
2

我认为你应该问自己的问题是为什么你需要一个单例类,而不是怀疑在任何地方你只会有一个光谱仪(例如由于成本),在这种情况下,它比任何软件更巧合的是单例设计原因。为什么你可能想要一个单例在On Design Patterns: When to use the Singleton? 单身人士的负面影响在What is so bad about singletons 中有介绍吗?. 就我个人而言,我不是单例模式的忠实拥护者,除非从软件的角度来看情况确实需要它,否则任何其他事情都可能导致未来的代码重构。

于 2013-05-13T09:55:13.413 回答
1

除了单例决策之外,我认为让一个类来发现设备并控制单个设备是一个坏主意——你无缘无故地将不同的功能放入同一个类中。

不了解更多就很难说,但总的来说,将功能拆分为单独的类可能更有意义:

  • HwLookup- 执行设备发现等。这可能是一个单例,但我不确定我会这样做 - 我看不出有什么特别的理由让它成为单例,但它可能是有意义的。它返回单个实例
  • SpectrometerProxy(或只是Spectrometer)代表单个设备,可用于设置/获取参数、检索测量结果等)

根据它做了多少事情,我什至不确定我是否会设计HwLookup为一个类:它可以是一个函数(例如,如果它所做的只是返回一个光谱仪代理列表)。没有理由将所有内容都放在 C++ 代码中的类中。

于 2013-05-13T09:56:17.127 回答