Синглтонная реализация с использованием шаблона Factory - PullRequest
0 голосов
/ 06 июля 2019

Поскольку шаблон синглтона имеет ряд потенциальных проблем, я слышал, что шаблон в реальной отрасли устарел.Итак, я реализовал один экземпляр с использованием 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 голосов
/ 06 июля 2019

Я не согласен с вашим утверждением

Поскольку шаблон синглтона имеет ряд потенциальных проблем, я слышал, что шаблон в реальной отрасли устарел.

Полагаю, вы имеете в виду проблему двойной проверки блокировки (DLCP). Это было хорошо описано в статье Скотта Мейерса и Андрея Александреску: C ++ и опасности двойной проверки блокировки .

Основной темой здесь был дизайн и использование безопасных потоков. Для однопоточного кода проблем с одноэлементным шаблоном не будет.

Так что ни одно крупное сообщество, такое как индустрия, не одобрит эту модель. Есть еще много вариантов использования, которые требуют синглтона. Может быть, какое-то правило кодирования в какой-то компании не позволяет этого.

И, DLCP очень стар. В новых версиях C ++ это полностью исправлено. Доступны поточно-безопасные версии. Вы можете посмотреть на здесь .

Теперь к вашему коду.

Это не заводской шаблон. Это чистый, но более сложный синглтон. Вы всегда возвращаете один и тот же экземпляр. Итак, синглтон.

И это печальная история, ваша реализация имеет DLCP и не является поточно-ориентированной.

Извините. , .

...