【发布时间】:2019-07-06 02:45:06
【问题描述】:
由于单例模式存在许多潜在问题,我听说这种模式在实际行业中已被弃用。所以我已经使用工厂模式实现了一个实例,如果这个实现不违反任何 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;
}
【问题讨论】:
-
我不明白这一点。如果你让
getLogger成为Logger的静态成员,那么绝对不会有任何改变,回到经典的单例。介绍LoggerFactory似乎毫无意义,只是一件忙碌的工作。 -
@IgorTandetnik,感谢您的回复。那么你有什么想法可以使用工厂模式来实现单个实例吗? “静态”使我无法提出新颖的解决方案,而不是使用单例模式。
-
我认为这可能更适合codereview.stackexchange.com
-
如果你只允许
Logger的一个实例存在,那么根据定义,无论你涂上多少闪光和口红,该实例都是一个单例。你不能说“我只想要一个X类的实例,但不知何故它不应该是一个单例。”坦率地说,我不明白你想要达到的目标。 -
是的,@IgorTandetnik,我同意你的看法。让我澄清一下我想弄清楚的事情,然后再重新上线。非常感谢!
标签: c++ design-patterns singleton factory