你以为你会写单例 其实你不会 完美单例的实现

在大家写单例的时候 懒汉模式 即在定义的时候再分配内存 第一时间想到的便是如下这种模式

class Singleton {
public:
 static Singleton * GetInstance() {
 if (_instance == nullptr) {
 _instance = new Singleton();
 }
 return _instance;
 }
private:
 Singleton(){}//构造
 Singleton(const Singleton &clone){} //拷⻉构造
 Singleton& operator=(const Singleton&) {}
 static Singleton * _instance;
}
Singleton* Singleton::_instance = nullptr;//静态成员需要初始化

公共静态成员函数调用私有构造函数来进行初始化

但是这种方式明显有大问题 首先这个单例什么时候析构呢?其次这个单例是线程安全的嘛?这个单例是可移植的嘛? 不能移植那是不是我每一个单例类都要这么写?

为了解决上面几个问题 完美的单例类诞生了

 

template<typename T>
class Singleton {
public:
static T& GetInstance() {
 static T instance; // 这⾥要初始化DesignPattern,需要调⽤DesignPattern 构造函数,同时会调⽤⽗类的构造函数。
 return instance;
 }
protected:
 virtual ~Singleton() {}
 Singleton() {} // protected修饰构造函数,才能让别⼈继承
 Singleton(const Singleton&) {}
 Singleton& operator =(const Singleton&) {}
};

读者就要问了 这就自动释放内存了? 是的 静态变量放在全局区 由操作系统释放 这就线程安全了?是的 c++11后 static修饰的变量在初始化时都具有线程安全性 

那为什么就可移植了呢?

看如下的代码

class DesignPattern : public Singleton<DesignPattern> {
 friend class Singleton<DesignPattern>; // friend 能让 Singleton<T> 访问到 DesignPattern构造函数
private:
 DesignPattern(){}
 DesignPattern(const DesignPattern&) {}
 DesignPattern& operator=(const DesignPattern&) {}
}

 首先继承的时候指明你的类型 最后把这个类声明为我的友元类 主要是为了让他能访问到我的私有构造函数 这样我在调用GetInstance()方法的时候才能构造我自己 

以后项目里的单例都可以采用这种方式去书写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值