C++ 单例模式

1. 将构造函数私有化
2. 在类中定义一个静态的指向本类型的指针变量
3. 定义一个返回值为类指针的静态成员函数
  • 四种单例模式的实现
  • 1.全局类+单例类(全局类负责回收单例类对象堆空间)
#include <iostream>
using namespace std;

class singleinstance{
public:
    static singleinstance * getInstance();
    friend class AutoRelease;
private:
    static singleinstance* _pinstance;
    singleinstance();
    ~singleinstance();
};

class AutoRelease{
public:
    AutoRelease(singleinstance*);
    ~AutoRelease();
private:
    singleinstance* _psingle;
};

AutoRelease::AutoRelease(singleinstance* p)
:_psingle(p)
{
    cout << "AutoRelease()" << endl;
}

AutoRelease::~AutoRelease()
{
    if(_psingle)
    {
        delete  _psingle;
        _psingle = nullptr;
    }   
    cout << "~AutoRelease()" << endl;
}
    
singleinstance * singleinstance::_pinstance = nullptr;                                                                                                                              
singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance* singleinstance::getInstance()
{
    if( _pinstance == nullptr )
        _pinstance = new singleinstance();
    return _pinstance;
}
  • 2.单例类+嵌套类(嵌套类负责回收单例类对象堆空间)
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();

private:
    class AutoRelease;
    static AutoRelease rel;
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

class singleinstance::AutoRelease
{
public:
    AutoRelease();
    ~AutoRelease();
};

singleinstance::AutoRelease::AutoRelease()
{
    cout << "AutoRelease()" << endl;
}

singleinstance::AutoRelease::~AutoRelease()
{
    if (_pinstance)
    {
        delete _pinstance;
        _pinstance = nullptr;
    }
    cout << "~AutoRelease()" << endl;
}

singleinstance *singleinstance::_pinstance = nullptr;
singleinstance::AutoRelease singleinstance::rel;

singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance *singleinstance::getInstance()
{
    rel;
    if (_pinstance == nullptr)
    {
        _pinstance = new singleinstance();
    }
    return _pinstance;
}
  • 3.单例类+atexit
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();
    static void destroy();

private:
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

singleinstance *singleinstance::_pinstance = nullptr;

singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance* singleinstance::getInstance()
{
    if(!_pinstance){
        _pinstance = new singleinstance();
        atexit( destroy );
    }   
    cout << "singleinstance::getInstance()" << endl;
    return _pinstance;
}
  • 4.单例类+pthread_once+atexit
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();
    static void destroy();
    static void init();

private:
    static pthread_once_t _once;
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

singleinstance *singleinstance::_pinstance = nullptr;
singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

pthread_once_t singleinstance::_once = PTHREAD_ONCE_INIT;

singleinstance *singleinstance::getInstance()
{
    pthread_once(&_once, init);
    cout << "singleinstance::getInstance()" << endl;
    return _pinstance;
}

void singleinstance::init()
{

    if (_pinstance == nullptr)
        _pinstance = new singleinstance();

    atexit(destroy);
    cout << "singleinstance::init" << endl;
}

void singleinstance::destroy()
{
    if (_pinstance)
    {
        delete _pinstance;
        _pinstance = nullptr;
    }
    cout << "singleinstance::destroy" << endl;
}
posted @   从今天学到明天  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示