/*直接照着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 单例模式 -- 饿汉
最新推荐文章于 2022-08-01 22:00:50 发布