设计模式 -- 单例模式

单例模式

  • 单例模式:确保在整个程序运行期间只有一个类的实例存在,并提供全局访问点。常用于只需要创建一次的对象(如:数据库连接、日志记录器或配置管理器)
    优点:全局唯一实例入口,简化其他模块获取该服务的复杂度;只有一个实例,整个应用程序生命周期中实例始终可用,减少重复创建对象,避免资源浪费等
    缺点:全局可见,增加了系统的耦合性;全局唯一,单元测试会变得困难,尤其是当涉及到复杂的业务逻辑时;添加新功能时,需要修改现有代码的单例实现,不符合开闭原则等
  • 单例模式实现由两种方式:饿汉式单例模式和懒汉式单例模式
  • 两种方式的实例化时机不同,饿汉式单例在程序启动时(或在任何静态初始化发生时)就创建了实例,而懒汉式单例则延迟到实际需要时才创建实例
    在这里插入图片描述

C++ 实现

饿汉式单例模式

  • 在main函数之前或动态库加载之前就完成了单例的创建,使用时不需要再创建对象,因此是线程安全的
  • 缺点:在程序启动时就已经存在,因此它可能在某些情况下导致不必要的资源使用,特别是创建成本较高且程序在大部分运行时间内都不需要它时。在这些情况下,懒汉式单例模式可能是一个更好的选择
  • 注:全局变量的初始化直接放在头文件中通常是不安全的,因为会导致在每个包含该头文件的编译单元中都有这些变量的实例,从而引发重复定义链接错误。通常,建议这些全局变量放在源文件中(.cpp)
#include <iostream>
class Singleton
{
   
public:
	static Singleton& getInstance() {
    return instance; }
	void PrintLog() {
    std::cout << "CHungryMode " << std::endl; };
public:
	// 禁止拷贝、移动和赋值
	Singleton(const  Singleton& mode) = delete;
	Singleton(Singleton&& mode) = delete;
	Singleton& operator=(const  Singleton& mode) = delete;
private:
	Singleton() {
   };
	~Singleton() {
   };
private:
	static  Singleton instance;          //静态成员变量
};
Singleton  Singleton::instance;  // 定义静态成员变量(通常放在源文件中,而不是头文件中)

int main()
{
   
	Singleton::getInstance().PrintLog();
    system("pause");
}
  • Singleton 也可以在cpp文件直接定义为全局变量
#include "Singleton.h"
static Singleton instance; 
Singleton& Singleton::getInstance(){
   
	return instance; 
}

void Singleton::PrintLog(){
   
	std::cout << "CHungryMode" << std::endl; 
}

懒汉式单例模式

  • 在C++11标准后的版本,可以直接使用静态局部变量、call_once 实现懒汉式单例模式
  • 在C++11标准前的版本或者使用指针的方式实现单例模式时,需要考虑多线程问题

使用静态局部变量实现懒汉式单例模式(推荐)

  • C++11及以后续标准,使用static局部变量来实现单例模式的懒汉式是一种线程安全且高效的方法
  • 利用了C++11中局部静态变量初始化的线程安全性保证,无需额外的同步机制。当局部静态变量第一次被访问时,它会在一个线程安全的上下文中被初始化,并且只会被初始化一次
  • 但使用C++11之前版本或者使用指针的方式实现单例模式时,需要考虑多线程问题 [静态变量]
#include <iostream>
class Singleton
{
   
public:
	static Singleton& getInstance() 
	{
    
	    static Singleton instance;  // C++11标准及以后线程安全的初始化过程 初始化严格发生一次
	    return instance; 
	}
	void PrintLog() {
    std::cout << "CLazyMode " << std::endl; };
private:
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton&</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值