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,具有线程安全的问题。(这个我还不太懂,以后补充)。

相关推荐
留白_5 小时前
MySQL学习(7)——存储过程
学习
oem1105 小时前
C++中的享元模式实战
开发语言·c++·算法
小酒丸子6 小时前
AD学习笔记之异形焊盘
笔记·学习
renhongxia16 小时前
如何对海洋系统进行知识图谱构建?
人工智能·学习·语言模型·自然语言处理·自动化·知识图谱
casual~7 小时前
第?个质数(埃氏筛算法)
数据结构·c++·算法
知识分享小能手7 小时前
Redis入门学习教程,从入门到精通,Redis 数据操作:知识点详解与代码实战(2)
数据库·redis·学习
Elnaij7 小时前
从C++开始的编程生活(20)——AVL树
开发语言·c++
hanbr7 小时前
【C++ STL核心】vector:最常用的动态数组容器(第九天核心)
开发语言·c++
red_redemption7 小时前
自由学习记录(138)
学习
仰泳的熊猫7 小时前
题目2308:蓝桥杯2019年第十届省赛真题-旋转
数据结构·c++·算法·蓝桥杯