由于单例模式存在许多潜在问题,因此我听说该模式在实际行业中已被弃用。因此,我已经使用Factory Pattern实现了一个实例,如果这个实现没有违反任何SOLID原则,我想听听大家的看法。 如果您认为我的新实施方式会引起其他副作用,则欢迎您提供任何反馈意见。
#include <iostream>
class Logger;
class LoggerFactory {
public:
Logger & getLogger();
};
class Logger {
private:
Logger() { std::cout << "Logger Constructed" << std::endl; }
friend class LoggerFactory;
public:
Logger & operator<<(std::string message) {
std::cout << "[log.txt] " << message << std::endl;
return *this;
}
};
Logger & LoggerFactory::getLogger() {
static Logger * logger = nullptr;
if (logger == nullptr)
logger = new Logger();
return *logger;
}
int main() {
LoggerFactory aa;
auto x = aa.getLogger();
x << "1st output";
auto y = aa.getLogger();
y << "2nd output";
return 0;
}
答案 0 :(得分:0)
我不同意你的说法
由于单例模式存在许多潜在问题,因此我听说该模式在实际行业中已被弃用。
我想您是指双重检查锁定问题(DLCP)。 Scott Meyers和Andrei Alexandrescu的论文C++ and the Perils of Double-Checked Locking中对此进行了很好的描述。
这里的主要主题是线程安全的设计和使用。对于单线程代码,单例模式不会有问题。
因此,没有像该行业这样的大型社区会反对这种模式。仍然有许多用例需要单例。也许某些公司的某些编码规则不允许这样做。
而且,DLCP很老。对于新的C ++版本,它是完全固定的。线程安全版本可用。您可以看看here。
现在输入您的代码。
这不是出厂模式。这是一个纯净但更复杂的单例。您总是返回相同的实例。所以,单身。
这是一个可悲的故事,您的实现具有DLCP并且不是线程安全的。
对不起。 。