首页 > 其他分享 >单例模式的两种实现方式(初始化时创建以及运行时创建)

单例模式的两种实现方式(初始化时创建以及运行时创建)

时间:2024-05-11 11:19:36浏览次数:23  
标签:std 初始化 Singleton cout instance 创建 Instance 单例

单例模式

删除析构函数通常意味着单例对象应该一直存活直到程序结束。在单例模式中,这通常是可取的,因为单例对象的生命周期通常与应用程序的生命周期相同。但是这样的话需要有一个函数来回收资源。

以下例子:

  1. 使用双重检查锁实现(线程安全)
  2. 实现模板来创建单例
#include <iostream>
#include <mutex>

template <typename T>
class Singleton
{
private:
    Singleton() = default;
    virtual ~Singleton() = default;
    static T* instance;
    static std::mutex mtx;
public:
    template<typename... Args>
    static T* Instance(Args&&... args)
    {
        if(instance == nullptr)
        {
            std::lock_guard<std::mutex> lock(mtx);
            if(instance == nullptr)
            {
                std::cout << "new" << std::endl;
                instance = new T(std::forward<Args>(args)...);
            }
        }
        return instance;
    }
    static void Destroy()
    {
        if(instance != nullptr)
        {
            std::lock_guard<std::mutex> lock(mtx);
            if(instance != nullptr)
            {
                delete instance;
                instance = nullptr;
                std::cout << "delete" << std::endl;
            }
        }
    }
};

template <typename T>
T* Singleton<T>::instance = nullptr;

template <typename T>
std::mutex Singleton<T>::mtx;

class A
{
public:
    A()
    {
        a = 10;
    }
    int a;
};

using namespace std;

int main()
{
    cout << Singleton<A>::Instance()->a << endl;
    Singleton<A>::Instance()->a = 1000;
    cout << Singleton<A>::Instance()->a << endl;
    Singleton<A>::Destroy();
    cout << Singleton<A>::Instance()->a << endl;
    //cout << Singleton<A>::Instance()->a << endl;
    return 0;
}

以下例子为初始化时就创建

#include <iostream>
#include <mutex>

class A
{
public:
    A()
    {
        a = 10;
    }
    int a;
};

template <typename T>
class Singleton
{
private:
    Singleton() = default;
    virtual ~Singleton() = delete;
    static T* instance;
public:
    static T* Instance()
    {
        return instance;
    }
};

template<typename T>
T* Singleton<T>::instance = new T();


using namespace std;

int main()
{
    cout << Singleton<A>::Instance()->a << endl;
    Singleton<A>::Instance()->a = 20;
    cout << Singleton<A>::Instance()->a << endl;
    return 0;
}

标签:std,初始化,Singleton,cout,instance,创建,Instance,单例
From: https://www.cnblogs.com/hy227/p/18186148

相关文章

  • 01 创建项目
    通过HBuilderX创建在HBuilderX工具里面直接创建即可安装uni-appvue3编译器插件如果是小程序,还需要下面的一些配置设置微信开发者工具安装地址开启服务端口命令行创建uni-app项目1创建:创建以typescript开发的工程npxdegitdcloudio/uni-preset-vu......
  • Spring中的单例bean
    Spring框架中的单例bean是线程安全的吗?不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。Spring框架并没......
  • FastAPI 创建
    1.安装FastAPI和Uvicorn:pipinstallfastapiuvicorn2.创建FastAPI应用。main.py:fromfastapiimportFastAPIapp=FastAPI()@app.get("/")defread_root():return{"Hello":"World"}3.在命令行中使用Uvicorn启动你的应用:uv......
  • ROS服务通讯创建服务节点(service)与客户端节点(client)
    学习参考:ROS/Tutorials/WritingServiceClient(python)-ROSWiki  首先需要一个工作空间,进入工作空间下的src文件夹下再创建一个功能包,进入功能包后创建scripts放置.py源码文件  服务节点源码创建格式:老样子还是剖析源码 首先导入包这里的_future_包中的print_func......
  • 使用selenium时,用webdriver初始化浏览器时间过久并伴随报错 operation timed out 的处
    我使用的系统是archlinux,在日常更新软件包时系统自动将selenium更新到目前(2024年5月)最新的版本,即:python-selenium4.20.0-1。在运行我的爬虫时报错缺少依赖包,经过一番查询得知现在的驱动由webdriver_manger统一接管了。webdrivermanger来对浏览器驱动和浏览器版本进行管理,但aur......
  • Vue入门到关门之Vue3项目创建
    一、vue3介绍1、为什么要学习vue3?vue3的变化:首先vue3完全兼容vue2,但是vue3不建议用vue2的写法;其次,vue3拥抱TypeScript,之前vue2使用的JavaScript,ts完全兼容js最后之前学的vue2是配置项api,而vue3是组合式apioptionsAPI(旧)=>compositionAPI(新),效果:代码组织更方便了,逻辑......
  • 单例模式
    设计模式之单例模式【一】什么是单例模式单例设计模式(SingletonDesignPattern):一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。当一个类的功能比较单一,只需要一个实例对象就可以完成需求时,就可以使用单例模式来节省......
  • 创建数据库
    #数据库的操作#删除数据库指令DROPDATABASEhsp_db01;#hsp_db01这个对应的是数据#用指令创建数据库CREATEDATABASEhsp_db01;#创建一个使用utf8字符集的hsp_db02数据库CREATEDATABASEhsp_db02CHARACTERSETutf8#创建一个使用utf8字符集,并带校队规则的hsp_db03数据库......
  • MySQL 创建数据库使用 UTF-8 问题
    问题描述将emoji符号(如......
  • 利用标准IO函数接口实现文件拷贝,把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中
    利用标准IO函数接口实现文件拷贝,把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中,如果文本B不存在则创建,要求文本A的名称和文本B的名称通过命令行传递,并进行验证是否正确。/******************************************************************** author :18312615416@1......