使用Factory模式的Singleton实现

时间:2019-07-06 02:45:06

标签: c++ design-patterns singleton factory

由于单例模式存在许多潜在问题,因此我听说该模式在实际行业中已被弃用。因此,我已经使用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;
}

1 个答案:

答案 0 :(得分:0)

我不同意你的说法

  

由于单例模式存在许多潜在问题,因此我听说该模式在实际行业中已被弃用。

我想您是指双重检查锁定问题(DLCP)。 Scott Meyers和Andrei Alexandrescu的论文C++ and the Perils of Double-Checked Locking中对此进行了很好的描述。

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

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

而且,DLCP很老。对于新的C ++版本,它是完全固定的。线程安全版本可用。您可以看看here

现在输入您的代码。

这不是出厂模式。这是一个纯净但更复杂的单例。您总是返回相同的实例。所以,单身。

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

对不起。 。