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

相关推荐
雨中rain7 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
oneouto9 分钟前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh3214 分钟前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
炭烤玛卡巴卡41 分钟前
学习postman工具使用
学习·测试工具·postman
thesky1234561 小时前
活着就好20241224
学习·算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
蜗牛hb1 小时前
VMware Workstation虚拟机网络模式
开发语言·学习·php
arong_xu1 小时前
现代C++锁介绍
c++·多线程·mutex
汤姆和杰瑞在瑞士吃糯米粑粑1 小时前
【C++学习篇】AVL树
开发语言·c++·学习
DARLING Zero two♡2 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode