使用工厂模式实施单例

Singleton implementation using Factory pattern

本文关键字:施单例 模式 工厂      更新时间:2023-10-16

由于Singleton模式存在许多潜在问题,因此我听说这种模式在真实的行业中被贬低。因此,我已经使用工厂模式实施了一个实例,如果该实现不违反任何可靠的原则,我想听听所有人的消息。如果您认为我的新实施会引起另一种副作用,则任何反馈都将受到高度赞赏。

#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;
}

我不同意您的语句

由于Singleton模式存在许多潜在问题,因此我听说这种模式在真正的行业中被贬低。

我想您是指双重检查的锁定问题(DLCP(。这在Scott Meyers和Andrei Alexandrescu论文中得到了很好的描述:C 以及双检查锁定的危险。

这里的主要主题是线程安全的设计和用法。对于单线程代码,Singleton模式不会有问题。

因此,没有像该行业这样的大社区会贬低这种模式。仍然有很多用例需要单身。也许某些公司中的某些编码规则不允许。

,DLCP非常老。使用新的C 版本,它是完全固定的。线程安全版本可用。您可以在这里看。

现在到您的代码。

这不是工厂模式。这是一个纯粹但更复杂的单身人士。您总是返回同一实例。所以,辛格尔顿。

,这是可悲的故事,您的实现具有DLCP,并且不是线程安全。

对不起。。。