среда, 16 мая 2012 г.

Синглтон на C++

Потребовалось сегодня написать достаточно грамотную реализацию паттерна проектирования "Синглтон" на C++ и чтоб в будущем не мудрить а копи-пастить. Приведу код здесь.


class Singleton
{
public:
    static Singleton::getInstance()
    {
        static Singleton instance;
        std::cout << "getInstance()" << std::endl;
        return instance;
    }
private:
    Singleton(const Singleton&);

    Singleton()
    {
        std::cout << "Singleton()" << std::endl;
    }
};

В этом коде скрыты от ВСЕГО клиентского кода конструктор этого класса и таким образом достигается невозможность создание объекта класса. Однако предоставлена возможность получения ссылки на объект через метод getInstance(). В виду того что последний метод класса, следовательно он имеет полное право обращаться к закрытым методам этого класса, т.е. конструктору.

7 комментариев:

izlesa комментирует...

Синглтон Маерса ) Только учитывай, что он потоко-небезопасный.

The NT Visigoth комментирует...

Я правильно понял, что этот велосипед до меня Майерс изобрел ? )

Alexander Teut комментирует...

Согласно новому стандарту, это будет thread safe, см.

https://groups.google.com/forum/?fromgroups#!topic/comp.lang.c++.moderated/qHDCU73cEFc

В C# и Java - не будет, там нет локальных static-ов и придётся применять т.н. double-lock-и (которые language-specific).

Не очень ясно, зачем нужны эти ужасающе медленные выводы в консоль. Они медленнее, чем printf где-то в 414 раз. Дёмин покровы срывал:

http://demin.ws/blog/russian/2012/04/25/endl-vs-new-line/

The NT Visigoth комментирует...

То что они медленней это понятно, но вот то что они std::iostream потомки это круто! Все из коробки и пашед. Будет пахать даже когда boost.iostream не стоит еще! ;) Там где скорость не важна это очень удобно!

Alexander Teut комментирует...
Этот комментарий был удален автором.
Alexander Teut комментирует...

А print зато даже не потомок, а стандартная команда консоли операционной системы. И живёт в языке с 1970 года.

The NT Visigoth комментирует...

А еще есть лошади, на них можно ездить. Большие плюсы, они не потребляют много бензина, они не ломаются посреди дороги, на них сложно попасть в аварию. Казалось бы плюсы, но ездим то мы на автомобилях!

Я к тому что даже проверенное временем решение, не всегда подходит к решениям задач. Print это подход чистого С. Если бы я хотел на нем программировать, то так бы и остался на С и не улучшал бы навыки юзания С++