【问题标题】:Singleton implementation using Factory pattern使用工厂模式的单例实现
【发布时间】: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


【解决方案1】:

我不同意你的说法

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

我猜你指的是双重检查锁定问题(DLCP)。这在 Scott Meyers 和 Andrei Alexandrescu 的论文中得到了很好的描述:C++ and the Perils of Double-Checked Locking。

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

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

而且,DLCP 已经很老了。对于新的 C++ 版本,它已完全修复。线程安全版本可用。你可以看看here。

现在到您的代码。

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

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

对不起。 . .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多