单身人士的替代品

时间:2011-09-01 07:12:19

标签: c++ design-patterns c++11

这与:What is so bad about Singletons

有关

你能举一些例子说明使用其他技术可以避免单身人士吗? 我需要在C ++中使用它,因此您可以使用C ++特定技术提供示例。

更清楚:如何在没有单例的情况下实现文件管理器,资源管理器,日志管理器等。

3 个答案:

答案 0 :(得分:30)

简单:创建文件管理器(或其他)类的单个实例,然后根据需要在应用程序内部传递它。很大程度上取决于您的应用程序结构,但通常您会有某种控制器对象在应用程序中创建其他重要对象。这可能是实例化文件管理器的对象,然后将其传递给它创建的需要文件管理器的其他对象。

如果你使用的是单身,因为某个类必须只有一个实例,那通常没问题。如果您正在使用它,因为单例是一个全局可访问的对象,可以让您避免考虑其他对象如何相互通信以及每个对象负责什么,这就是您开始遇到问题的地方。

文件管理器就是一个很好的例子。起初看起来应该只有零个或一个文件管理器对象的实例。但那有必要吗?你不能同时在一台机器上有两个文件系统吗?

答案 1 :(得分:6)

  

如何在没有单身人士的情况下实现文件管理器,资源管理器,日志管理器等。

不要让它们成为单例并将它们作为参数和引用传递给调用树和对象网。

作为一般规则:如果您只需要 n 个实例,请创建仅n 个实例。

或者:如果一个精心设计的类的两个实例在没有违反类合同的情况下不会发生冲突,请不要将其设为单例。

答案 2 :(得分:3)

  

你能举一些例子说明使用其他技术可以避免单身人士吗?

在更高级别的代码中,只需直接创建实例,然后传递它。你应该在尽可能高的水平上做到这一点仍然有意义。

在较低级别的代码中,接受对现有实例的引用作为参数。如果你可以在没有设计的情况下使用火焰串,就不要接受工厂,并且绝对不要在不属于该类逻辑核心的事情上调用构造函数/ new

如果您遵循这两个规则,您将隐式管理您创建的实例数量,并且不会通过强制单一设计(通常是短视的设计)将自己描绘成一个角落。

  

如何在没有单身人士的情况下实现文件管理器,资源管理器,日志管理器等

我不会。我创建了可以实例化的类,让应用程序自己调用创建了多少个实例以及它们是如何创建的。

与此同时,我不会让我的应用程序的低级部分调用任何镜头。仅仅因为我写入日志并不意味着我必须知道它应该存储在哪里,我正在写入什么级别的日志记录层次结构,应该应用哪些过滤器等等。

我会让代码的高级部分决定这些事情。这样,如果我改变主意,我可以废弃先前的决定,吹走并重新创建一些顶级代码,而不是触摸写入到日志中的任何代码(我的大部分应用)