VSCode上通过C++实现单例模式

单例模式实际上就是为了确保一个类最多只有一个实例,并且在程序的任何地方都可以访问这个实例,也就是提供一个全局访问点,单例对象不需要手动释放,交给系统来释放就可以了,单例模式的设计初衷就是为了在整个应用程序的生命周期中只创建一个实例,并且在需要时重复使用该实例,而不是频繁地创建和销毁对象。因此,在应用程序运行期间,单例对象通常会一直存在,直到应用程序结束。

一般来说,实现单例模式的方式有两种,一种是懒加载的方式,另外一种是预加载的方式。

实际上实现单例模式的基本步骤其实是一样的。第一步都是将构造函数和析构函数私有化,然后定义一个静态单例对象和声明一个静态单例对象获取函数,最后初始化单例对象和定义单例对象获取函数。

懒加载:当使用到单例对象的时候,才创建这个对象。

main函数

cpp 复制代码
#include"Test.h"
#include<iostream>
int main()
{
    Test*t1=Test::get_instance();
    Test*t2=Test::get_instance();
    std::cout<<"t1:"<<t1<<std::endl;
    std::cout<<"t2:"<<t2<<std::endl;
    return 0;
}

Test.h

将构造函数私有化 ,可以阻止外部代码直接实例化类的对象,强制使用单例模式提供的静态方法来获取类的唯一实例。这样可以确保在整个应用程序中只有一个实例存在。通过私有化析构函数,可以防止外部代码直接删除单例对象,从而确保单例对象在整个应用程序的生命周期内保持存在。这有助于避免意外的对象销毁和内存泄漏。

将单例对象(t_instance)声明为静态的是为了确保单例对象的唯一性、全局访问性和简化访问方式。静态单例对象可以在整个应用程序中被直接访问,避免多次实例化的情况发生,符合单例模式的设计原则

cpp 复制代码
class Test
{
public:
static Test*get_instance();
private:
Test();
~Test();
static Test*t_instance;
};

Test.cpp

cpp 复制代码
#include"Test.h"
Test*Test::t_instance=nullptr;
Test *Test::get_instance()
{
    if(t_instance==nullptr)
    {
        t_instance=new Test();
    }
    return t_instance;
}
Test::Test()
{

}
Test::~Test()
{
delete t_instance;
}

运行代码,可以发现,两个Test对象的地址是一样的,也就是说明这两个对象是同一个对象。

上面这种写法的懒加载其实是线程不安全的,当多个线程调用get_instance函数时,可能会创建出多个对象,将单例获取函数改进一下就可以了。

cpp 复制代码
#include<mingw.mutex.h>
class Test
{
public:
static Test*get_instance();
private:
Test();
~Test();
static Test*t_instance;
static std::mutex tmutex;
};
cpp 复制代码
#include"Test.h"
Test*Test::t_instance=nullptr;
std::mutex Test::tmutex;
Test *Test::get_instance()
{
    if(t_instance==nullptr)
    {
        std::lock_guard<std::mutex>lk(tmutex);
        t_instance=new Test();
    }
    return t_instance;
}
Test::Test()
{

}
Test::~Test()
{
delete t_instance;
}

预加载:程序启动的时候,就将对象创建好。

只需要更改懒加载的Test.cpp就可以了,不必判断单例对象是否为空,在类被第一次使用的时候就直接创建好了单例对象。

cpp 复制代码
#include"Test.h"
Test*Test::t_instance=new Test();
Test *Test::get_instance()
{
    return t_instance;
}
Test::Test()
{

}
Test::~Test()
{
delete t_instance;
}
相关推荐
佳児素花痴╮12 分钟前
Qt速通2
开发语言·qt
“AI国潮设计-小江”36 分钟前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
2601_9623649738 分钟前
重装系统后,Windows Hello 为什么要重新录入人脸?
windows·安全·电脑
529宝宝起名网44 分钟前
用 Python 分析汉字字源与起名用字的关联规律:从六书结构到文化寓意的起名偏好洞察
开发语言·python
汉克老师1 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程1 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃1 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝1 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python