/*直接照着boost库的一个比较广泛的单例模式写的,一字不错,boost有很多单例模式可以研究 *最近项目用到一个单例模式,是教科书使得,'懒汉模式',这个是'饿汉模式',优点是在main函数 *开始之前就构造实例了,这样是线程安全的,效率比较高,毕竟不是在堆上创建的一般单例不需要考虑内存的泄露,静态变量生存周期 *和程序运行周期是一样的,知道程序结束而释放,。。。总之没必要为了一个单例模式安装boost库吧 *直接记下来得了。我是这样认为的,这个单例是其中之一,还有其他好多的单例模式需要学习,目前写来 *这一个吧,现在项目足够了 */ #include <iostream> template<typename T> struct SingletonDefault { private: /* ObjectCreate是一个辅助类,将其对象定义为静态变量,这样在main函数开始前会构建其静态变量, * 在构建期间调用Instance函数,定义单例模式对应的实例 * 另外有一个DoNothing方法,该方法是空方法,和模板实例的延迟构造有关,调用DoNothing的前提是 * object_creator在这之前被构造,这样迫使object_creator在main函数执行前被构造 */ struct ObjectCreator { ObjectCreator(); void DoNothing() const; }; static ObjectCreator object_creator; SingletonDefault(); public: typedef T object_type; static object_type& Instance(); }; template<typename T> typename SingletonDefault<T>::ObjectCreator SingletonDefault<T>::object_creator; template<typename T> inline SingletonDefault<T>::ObjectCreator::ObjectCreator() { SingletonDefault<T>::Instance(); } template<typename T> inline void SingletonDefault<T>::ObjectCreator::DoNothing() const {} template<typename T> inline typename SingletonDefault<T>::object_type& SingletonDefault<T>::Instance() { static object_type obj; object_creator.DoNothing(); return obj; } #define SINGLETON(type, name) typedef SingletonDefault<type> name class Node { public: /* * 将构造函数声明私有或保护类型,防止其他实例出现,将单例模式类声明为友元可以访问其构造函数 * 如果是单例类以外的其他地方创建实例的话,会因无权访问构造函数而报错,同时关掉拷贝函数 */ friend SingletonDefault<Node>; void Print() const; private: Node() = default; Node(const Node&) = delete; Node(Node&&) = delete; }; void Node::Print() const { std::cout << "Hello World!" << std::endl; } SINGLETON(Node, GNodeMng); int main() { GNodeMng::Instance().Print(); }
Singleton 单例模式 -- 饿汉
猜你喜欢
转载自blog.csdn.net/letterwuyu/article/details/78065991
今日推荐
周排行