Потребовалось сегодня написать достаточно грамотную реализацию паттерна проектирования "Синглтон" на 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 комментариев:
Синглтон Маерса ) Только учитывай, что он потоко-небезопасный.
Я правильно понял, что этот велосипед до меня Майерс изобрел ? )
Согласно новому стандарту, это будет 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/
То что они медленней это понятно, но вот то что они std::iostream потомки это круто! Все из коробки и пашед. Будет пахать даже когда boost.iostream не стоит еще! ;) Там где скорость не важна это очень удобно!
А print зато даже не потомок, а стандартная команда консоли операционной системы. И живёт в языке с 1970 года.
А еще есть лошади, на них можно ездить. Большие плюсы, они не потребляют много бензина, они не ломаются посреди дороги, на них сложно попасть в аварию. Казалось бы плюсы, но ездим то мы на автомобилях!
Я к тому что даже проверенное временем решение, не всегда подходит к решениям задач. Print это подход чистого С. Если бы я хотел на нем программировать, то так бы и остался на С и не улучшал бы навыки юзания С++
Отправить комментарий