设计模式:单例模式

单例模式保证一个类只有一个实例,并且提供了全局访问该实例的方法。在单例模式中,通常使用一个静态方法或者一个静态变量来保存实例。该实例被程序的所有模块共享。

具体过程:

1、定义一个单例类

2、私有化构造函数,防止外界直接创界单例类的对象

3、禁用拷贝构造,移动赋值等函数,可以私有化,也可以直接使用=delete

4、使用一个公有的静态方法获取该实例

5、确保在第一次调用之前该实例被构造

在写具体代码之前还需要知道单例模式的两种分类,饿汉和懒汉。所谓的饿和懒其实是创建实例的状态形容。

饿汉就是一点不顾一切的感觉,在类加载的时候就创建唯一的单例实例,不论该实例是否会被使用。这种方式是线程安全的。

cpp 复制代码
#pragma once
#include  <mutex>
//饿汉模式
class Singleton {
private:
	//私有构造函数
	Singleton() {}

	//私有静态指针,指向唯一的实例
	static Singleton* instance;
public:
	//禁用拷贝构造和赋值构造函数。
	Singleton(const Singleton&) = delete;
	Singleton& operator = (const Singleton&) = delete;

	//获取唯一实例的静态方法
	static Singleton* getInstance()
	{
		return instance;
	}
};
Singleton* Singleton::instance = nullptr;   //初始化静态成员
Singleton* Singleton::instance = new Singleton();

而懒汉则是有一种能少创建就少创建的偷懒的感觉,即只要在第一次调用获取实例的方法时才会创建唯一实例,从而节省资源。这种方式是线程不安全的,需要去加锁。

cpp 复制代码
//加锁的懒汉模式
class SingletonH
{
private:
	singletonH() {};
	static SingletonH* instance;
	static std::mutex mutex;
public:
	Singleton(const Singleton&) = delete;
	Singleton& operator = (const Singleton&) = delete;
	static Singleton* getInstance()
	{
		if(instance == nullptr)
		{
			std::lock_guard<std::mutex>lock(mutex);  //加锁
			instance = new SingletonH();
		}
		return instance;
	}
};
SingletonH* SingletonH::instance = nullptr;

总结:饿汉单例适合在程序启动时资源充足,且需要立即使用单例的场景。懒汉单例适合资源敏感的场景,或者单例实例较大且不一定每次都需要实例化时使用。

相关推荐
七月丶24 分钟前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞32 分钟前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟18 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder18 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式