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

单例模式

定义

单件模式确保一个类只有一个实例,并提供一个全局访问点。

单件模式 对比 全局变量的好处: 不需要在启动时就被创建,需要时就可以创建。

实现

  • 私有构造函数确保了只有类本身能够创建自己的对象。
  • 删除析构函数通常意味着单例对象应该一直存活直到程序结束。在单例模式中,这通常是可取的,因为单例对象的生命周期通常与应用程序的生命周期相同。但是这样的话需要有一个函数来回收资源。

以下例子:

  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;
}
posted @   227569hy  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示