C++单例模式

单例模式

什么是单例模式:

只能实例化一个类对象(全局有且只有一个类的static实例)

使用场景:

进程管理器、日志管理器、网站访问计数器、应用配置程序、线程池、服务器的连接管理器

实现单例模式的原理/步骤

1、禁止在类外随意实例化对象,把构造函数/拷贝构造都私有化private

2、确保类对象只有一份,在类中定义一个静态的类对象成员变量

3、需要提供一个换取静态类对象成员变量的公开接口,设计静态成员函数用于获取那唯一 的一个静态类对象

饿汉模式的单例:

程序运行开始时就立即实例化单例对象,不管后期是否用到都会完成实例化

缺点:如果后期并没有使用,就浪费资源、时间

优点:不可能被多个线程同时运行创建多份(线程安全)

#include <iostream>
using namespace std;

class Single
{
    static Single obj;    //定义一个静态成员变量
    Single(void)    //构造函数私有化
    {
        cout << "我是构造函数" << endl;    
    }
    Single(const Single& that)    //拷贝构造私有化
    {
        cout << "我是拷贝构造" << endl;    
    }
public:
    static Single& get_obj(void)    //设计静态成员函数作为接口
    {
        return obj;    
    }

    void show(void)
    {
        cout << &obj << endl;    
    }
};

Single Single::obj;    //静态成员初始化

int main(int argc,const char* argv[])
{
//    Single::obj;
    Single& s = Single::get_obj();
    s.show();
    Single& s1 = Single::get_obj();
    s1.show();
}

输出:

我是构造函数    //说明只实例化了一次
0x804a0d4
0x804a0d4

懒汉模式的单例:

什么时候使用,就什么时候实例化单例类对象

优点:使用时才会去创建,节约时间、资源

缺点:可能会被多个线程同时实例化,有可能会创建出多个单例类对象(线程不安全),

实例:

#include<iostream>
using namespace std;

class Single
{
    static Single* obj;
    Single(void)
    {
        cout << "我是构造函数" << endl;    
    }
    Single(const Single& that)
    {
        cout << "我是拷贝构造" << endl;    
    }
public:
    static Single& get_obj(void)
    {
        if(NULL == obj)
        {
            obj = new Single;    
        }
        return *obj;    
    }

    void show(void)
    {
        cout << obj << endl;    
    }
};

Single* Single::obj;

int main(int argc,const char* argv[])
{
    Single& s = Single::get_obj();
    s.show();
    Single& s1 = Single::get_obj(); 
    s1.show();
}

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