C++实现单例模式

转载一篇我自己写在CSDN上的一篇文章

单例模式

一、non thread safe

//-----------------------------------------------懒汉模式
//Singleton_lazy.h
#pragma once
#include <memory>
class Singleton_lazy{
private:
    static std::unique_ptr<Singleton_lazy> instance;
    Singleton_lazy() = default;
    Singleton_lazy(const Singleton_lazy&) = delete;
    Singleton_lazy& operator=(const Singleton_lazy&) = delete;
    Singleton_lazy(const Singleton_lazy&&) = delete;
    Singleton_lazy& operator=(const Singleton_lazy&&) = delete;
private://资源
    int abc = 0
public:
    static Singleton_lazy* getInstance(){
        if(!instance)
            instance.reset(new Singleton_lazy);
        return instance.get();
    }
    int doSomething(){
        return abc;
    }
    void doSomthingadd(){
        //成员函数做事
        abc++;
    }
};
//Singleton_lazy.cpp
#include "Singleton_lazy.h"
std::unique_ptr<Singleton_lazy> Singleton_lazy::instance(nullptr);


//-----------------------------------------------饿汉模式
//Singleton_eager.h
#pragma once
#include <memory>
class Singleton_eager{
private:
    static std::unique_ptr<Singleton_eager> instance;
    Singleton_eager() = default;
    Singleton_eager(const Singleton_eager&) = delete;
    Singleton_eager& operator=(const Singleton_eager&) = delete;
    Singleton_eager(const Singleton_eager&&) = delete;
    Singleton_eager& operator=(const Singleton_eager&&) = delete;
private://资源
    int abc = 0;
public:
    static Singleton_eager* getInstance(){
        return instance.get();
    }
    int doSomething(){
        //成员函数做事
        return abc;
    }
    void doSomthingadd(){
        //成员函数做事
        abc++;
    }
};
//Singleton_lazy.cpp
#include "Singleton_eager.h"
std::unique_ptr<Singleton_eager> Singleton_eager::instance(new Singleton_eager);

二、thread safe

//-----------------------------------------------懒汉模式
//Singleton_lazy.h
#pragma once
#include <memory>
#include <mutex>
class Singleton_lazy{
private:
    static std::unique_ptr<Singleton_lazy> instance;
    static std::mutex mut;
    static std::once_flag initFlag;
    Singleton_lazy() = default;
    Singleton_lazy(const Singleton_lazy&) = delete;
    Singleton_lazy& operator=(const Singleton_lazy&) = delete;
    Singleton_lazy(const Singleton_lazy&&) = delete;
    Singleton_lazy& operator=(const Singleton_lazy&&) = delete;
private://资源
    int abc = 0;
public:
    static Singleton_lazy* getInstance(){
        //getInstance本身是线程安全的,因为instance成员只读
        //call once 保证单次初始化
        std::call_once(initFlag, [&](){
                instance.reset(new Singleton_lazy);
            }
        );
        return instance.get();
    }
    int doSomething(){
        std::lock_guard<std::mutex> lg(mut);
        //成员函数做事
        return abc;
    }
    void doSomthingadd(){
        std::lock_guard<std::mutex> lg(mut);
        //成员函数做事
        abc++;
    }
};
//Singleton_lazy.cpp
#include "Singleton_lazy.h"
std::unique_ptr<Singleton_lazy> Singleton_lazy::instance(nullptr);
std::mutex Singleton_lazy::mut;
std::once_flag Singleton_lazy::initFlag;


//-----------------------------------------------饿汉模式
//Singleton_eager.h
#pragma once
#include <memory>
#include <mutex>
class Singleton_eager{
private:
    static std::unique_ptr<Singleton_eager> instance;
    static std::mutex mut;
    Singleton_eager() = default;
    Singleton_eager(const Singleton_eager&) = delete;
    Singleton_eager& operator=(const Singleton_eager&) = delete;
    Singleton_eager(const Singleton_eager&&) = delete;
    Singleton_eager& operator=(const Singleton_eager&&) = delete;
private://资源
    int abc = 0;
public:
    static Singleton_eager* getInstance(){
        //getInstance本身是线程安全的,因为instance成员只读
        //每有重复初始化的问题
        return instance.get();
    }
    int doSomething(){
        std::lock_guard<std::mutex> lg(mut);
        //成员函数做事
        return abc;
    }
    void doSomthingadd(){
        std::lock_guard<std::mutex> lg(mut);
        //成员函数做事
        abc++;
    }
};
//Singleton_eager.cpp
#include "Singleton_.h"
std::unique_ptr<Singleton_eager> Singleton_eager::instance(new Singleton_eager);
std::mutex Singleton_eager::mut;
#C++单例模式的实现示例#
全部评论

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11192次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1981次浏览 42人参与
# 米连集团26产品管培生项目 #
6058次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7666次浏览 43人参与
# 简历第一个项目做什么 #
31764次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433597次浏览 3926人参与
# MiniMax求职进展汇总 #
24141次浏览 310人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187239次浏览 1122人参与
# 牛客AI文生图 #
21454次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152486次浏览 888人参与
# 研究所笔面经互助 #
118979次浏览 577人参与
# 简历中的项目经历要怎么写? #
310407次浏览 4220人参与
# AI时代,哪些岗位最容易被淘汰 #
63913次浏览 828人参与
# 面试紧张时你会有什么表现? #
30521次浏览 188人参与
# 你今年的平均薪资是多少? #
213166次浏览 1039人参与
# 你怎么看待AI面试 #
180196次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64342次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76565次浏览 374人参与
# 我的求职精神状态 #
448163次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363562次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160689次浏览 1112人参与
# 校招笔试 #
471336次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务