如何不使用单例

How to not use a singleton?

本文关键字:单例 何不使      更新时间:2023-10-16

根据文章,建议不要使用单例。但是,有什么替代或更好的方法?例如,在我的 GUI 中,我有一个日志窗口。操作后,无论它在哪里,如果使用单例,我都可以轻松地在日志窗口中记录一些信息。单例提供了一个快捷方式,尽管是通过全局路由。如果不使用单例,有什么好方法可以做到吗?请注意,操作可能会分散在任何地方。多谢!

做最简单的事情。 根据我的经验,进行日志记录的最简单方法是使用免费函数。

void logError(const std::string& message);
void logWarning(const std::string& message);
void logInfo(const std::string& message);
也许

实现只是一个全局的,也许不是。 你如何实现它并不重要。 重要的是他们不会根据它的实现方式编写不同的代码。 专注于公开的界面。

恕我直言,单身人士很糟糕,因为它们以后很难改变。 不是因为它们的实现方式,而是因为它们倾向于只允许其背后有一个单例的接口。 这很难改变。 当更改困难时,维护成本很高。

关于辛格尔顿有几个常见的误解。

首先是它具有任何兑换功能并且很有用。错。这是废话。

第二个误解是它的意思是"只有一个对象"。没有。它的意思是"强制实施只能有一个对象的规则"。那不是一回事。

《四人帮设计模式》一书中的单例模式是"创建模式",因为它的作用与对象的创建方式有关。 所谓的模式的目的是提供对象的单个全局实例,并防止创建其他实例。例如,将构造函数设为私有并提供一个仅允许创建一个实例的静态函数。(事实上,它在一种类型中有两个责任,这应该是一个线索,它被打破了,它违反了单一责任原则。

如果您必须有一个全局实例,那么(尽管这可能是设计不佳的症状)您只需创建一个即可做到这一点。 然后,您不需要"强制实施规则,只能有一个"属性,因此您不需要单例"模式"。

太多人说"这是一个单例",当他们的意思是"只有一个"时,这与说"我使用语言规则来保证只能有一个"是不一样的。

或者他们说"我有一个单例",好像这证明了拥有一个全局变量是合理的。给它一个花哨的名字并不能成为垃圾设计的借口。

如果您需要一个实例,请创建一个实例。不要创建更多它们。宾果游戏,你有一个实例。容易。如果您无法控制程序的其他位如何访问该实例,那么您的程序已经损坏。修复代码。停止依赖该类型的单个实例。阻止创建其他实例并不能解决您的设计问题,只会使情况变得更糟。

这就是"只创建一"模式。

如果大量代码需要访问该对象,则将其传递给代码(通过构造函数或函数参数),以便显式依赖关系。这是从上面参数化模式。

对于日志记录模块,想要记录的代码不应该关心它正在记录到"单例"(即不能有多个实例的类型),它应该记录到它传递的记录器,或者它应该通过全局函数或对象进行记录,不需要是"单例",它可以只是一个只有一个的全局。 您是编写代码来强制执行只有一个std::cout的规则并调用std::cout::instance(),还是只是接受它是全局的并使用它? 您是打电话给printf::instance()("%s", ...)还是只是printf,让printf的实施者担心它是如何工作的?