[C++][设计模式] : 单例模式(饿汉和懒汉)

单例模式

引言

对于程序设计的时候,我们有些时候不希望平凡的创建对象,比如创建这个一个对象的成本很高,比如线程池,这个时候我们希望共享一个对象,这个时候,就可以使用我们的单例模式。

单例模式本质上是一种程序设计的方式,我们通过合理的设计,使得某一种类只能定义一次,通过类的静态的方式调用

防止拷贝构造和赋值重载

其实只需要防止拷贝构造即可,因为构造不成功,更不可能赋值重载。

我们提供一种优雅的方式,继承nocopy类

cpp 复制代码
// 定义不能拷贝的类作为基类
class NoCopy
{
public:
	NoCopy() = default;
	// 将拷贝构造和赋值重载删除
	NoCopy(const NoCopy&) = delete;
	NoCopy& operator=(const NoCopy&) = delete;
};

通过继承实现单例模式

这里我只使用了C++11, 也可以使用C++17的更高级的特性简化

cpp 复制代码
class Object : public NoCopy
{
private:
	Object() {}
public:
	Object& getInstance()
	{
		if (self == nullptr) self = std::unique_ptr<Object>();

		return *self;
	}

	static std::unique_ptr<Object> self;
};

std::unique_ptr<Object> Object::self = nullptr;

在这种情况下,我们只需要调用Object::getInstance()就可以直接获取到对象。

饿汉和懒汉模式

上面我创建的思想是懒汉模式。

饿汉模式就是无论我是否使用这个单例对象,我都会在执行程序的时候创建一个对象
懒汉模式更像是一种延迟定义,只有我们需要使用它的时候,我们才进行创建

  • 恶汉模式: 直接创建

    cpp 复制代码
    std::unique_ptr<Object> Object::self = std::make_unique(); // make_unique是C++14支持
    Object& getInstance() { return *self; }
  • 懒汉模式 : 延迟创建

    cpp 复制代码
    Object& getInstance()
    	{
    		if (self == nullptr) self = std::unique_ptr<Object>();
    
    		return *self;
    	}
    std::unique_ptr<Object> Object::self = nullptr;
相关推荐
liu****3 分钟前
第15届省赛蓝桥杯大赛C/C++大学B组
开发语言·数据结构·c++·算法·蓝桥杯·acm
无缘之缘15 分钟前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯
OTWOL19 分钟前
C语言操作符终极揭秘:表达式求值秘籍
c语言·开发语言·c++
Q741_14719 分钟前
每日一题 3740. 三个相等元素之间的最小距离 I 3741. 三个相等元素之间的最小距离 II 模拟 哈希表 C++ 题解
c++·算法·leetcode·模拟·数组·哈希表
Ancelin安心21 分钟前
西工大noj(C/C++)100题参考题解及注意事项(2024)
c语言·c++·ide·windows·vscode·算法
Sarvartha24 分钟前
C++ STL 队列(queue)学习笔记
c++
李日灐29 分钟前
【优选算法3】二分查找经典算法面试题
开发语言·c++·后端·算法·面试·二分查找·双指针
Z1Jxxx35 分钟前
C++ P1151 子数整数
开发语言·c++·算法
自信150413057591 小时前
重生之从0开始学习c++之类与对象(中)
c++·学习
不爱吃炸鸡柳1 小时前
5道经典贪心算法题详解:从入门到进阶
开发语言·数据结构·c++·算法·贪心算法