如何不使用单例
How to not use a singleton?
根据文章,建议不要使用单例。但是,有什么替代或更好的方法?例如,在我的 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
的实施者担心它是如何工作的?
- 为什么在单例中,检查类==空?
- C++ 实现模板单例类时出现链接错误
- 在类中存储单例的指针
- C++中的单例实现在调用 getInstance 函数时不会产生相同的类实例
- 具有非默认构造函数的单例类
- 使用 std::call_once 实现类似单例的功能
- 为什么单例使用指针而不是引用?
- 提升单例池release_memory vs purge_memory
- 具有 QObject 继承的单例 - Qt
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- C++单例,不会为此文档加载任何符号
- 使用 CRTP 实现单例
- C++单例模板类使我的程序崩溃
- 初学者C++线程安全单例设计
- 派生类是单例是否是一种好的做法
- _CrtIsValidHeapPointer(块)错误在应用单例-帕特恩后退出主窗口时引发
- 为什么单例模板使我的程序崩溃
- 是什么使单例线程不安全
- 通过惰性求值使 Meyers 的单例线程安全快速地
- 可能使一个单例结构在c++ ?如何去做