C++学习—单例模式

目录

​编辑

一,单例模式介绍

二,单例模式下的两种模式

1,饿汉模式

2,懒汉模式


一,单例模式介绍

单例:在全局只有一份实例。

单例模式是编程的经典模式之一。

二,单例模式下的两种模式

1,饿汉模式

饿汉模式:在main函数启动前就先把实例化的类对象准备好。

1,提前准备好实例化对象:要使用全局变量。

2,保证全局只有一个实例化对象:要将构造函数,拷贝构造函数,赋值重载函数私有化防止类外面访问。

3,一个对象要是全局的又要能访问类里面的私有化方法:要在类里面声明一个static对象,在类外面定义。

代码示例:

cpp 复制代码
class Singleton
{

public:

	static Singleton*Get()//定义一个函数来调用这个对象。
	{
		return &member;
	}

	void change(int x)//改变成员_a值的函数
	{
		member._a = x;
	}

	int val()//返回一个成员_a值
	{
		return member._a;
	}


private:

	//构造函数私有化,赋值重载禁用
	Singleton() {};
	Singleton(const Singleton& aa)=delete;
	Singleton& operator=(Singleton) = delete;

	int _a = 0;
	static Singleton member;//在类里面声明一个static成员。
};

Singleton Singleton::member;//类外定义

以上的饿汉模式的代码示例,现在来讲一讲饿汉模式的优缺点:

优点:1,设计简单。

缺点:1,会导致程序启动慢 2,当单例模式的类实例有顺序时,顺序不可控

2,懒汉模式

懒汉模式:第一次使用时再创建。并且要解决饿汉模式的缺点。

1,提前准备好实例化对象:要使用全局变量。但是又要改掉饿汉模式下的启动慢的问题,所以要将饿汉模式下的全局对象改成一个全局指针。

2,保证全局只有一个实例化对象:要将构造函数,拷贝构造函数,赋值重载函数私有化防止类外面访问。

3,一个对象要是全局的又要能访问类里面的私有化方法:要在类里面声明一个static指针,在类外面定义。

示例代码:

cpp 复制代码
class Singleton2
{

public:

	static Singleton2* Get()//定义一个函数来调用这个对象
	{
		if (member2 == nullptr) return member2 = new Singleton2;//第一次使用时创建
		else return member2;
	}

	void change(int x)//改变成员_a值的函数
	{
		member2->_a = x;
	}

	int val()//返回一个成员_a值
	{
		return member2->_a;
	}


private:

	//构造函数私有化,赋值重载禁用
	Singleton2() {};
	Singleton2(const Singleton& aa) = delete;
	Singleton2& operator=(Singleton) = delete;

	int _a = 0;
	static Singleton2* member2 ;//在类里面声明一个static成员。
};

Singleton2* Singleton2::member2 = nullptr;//类外定义初始化为nullptr

以上便是懒汉模式的示例代码。懒汉模式的优缺点如下:

优点:

1,解决了饿汉模式的缺点。

缺点:

1,具有线程安全的问题。(这个我还不太懂,以后补充)。

相关推荐
「QT(C++)开发工程师」16 分钟前
C++11 新特性 正则表达式、随机数库、元组
c++·正则表达式
ZTLJQ36 分钟前
深入理解Autoencoder:无监督学习的异常检测与数据压缩利器
学习
夏星印1 小时前
argparse解析器参数详解
经验分享·笔记·python·学习·argparse
free-elcmacom1 小时前
C++ 默认参数详解:用法、规则与避坑指南
开发语言·c++
Shining05961 小时前
AI编译器系列(二)《AI 编译器中的前端优化》
人工智能·学习·其他·学习方法·infinitensor
码喽7号1 小时前
springboot学习四:RESTful风格+swagger
spring boot·学习·restful
Albert Edison2 小时前
【ProtoBuf 语法详解】Any 类型
服务器·开发语言·c++·protobuf
无忧.芙桃2 小时前
C++11的部分内容(上)
c++
weixin_458872612 小时前
东华复试OJ二刷复盘8
学习
海奥华22 小时前
Rust初步学习
开发语言·学习·rust