Singleton 单例模式 -- 饿汉

/*直接照着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();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值