C++笔记之单例模式

C++笔记之单例模式

参考笔记:C++笔记之call_once和once_flag

code review

文章目录

1.返回实例引用

代码

cpp 复制代码
#include <iostream>

class Singleton {
  public:
    static Singleton &getInstance() {
        static Singleton instance;
        return instance;
    }

    void printMessage() {
        std::cout << "hello world!" << std::endl;
    }

  private:
    Singleton() {}                          // 禁止外部创建实例
    Singleton(const Singleton &);           // 禁止复制实例
    Singleton operator=(const Singleton &); // 禁止赋值实例
};

int main() {
    Singleton &instance = Singleton::getInstance();
    instance.printMessage();
    return 0;
}

2.返回实例指针

代码

cpp 复制代码
#include <iostream>

class Singleton {
  public:
    static Singleton *getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void printMessage() {
        std::cout << "hello world!" << std::endl;
    }

  private:
    static Singleton *instance;
    Singleton() {}                          // 禁止外部创建实例
    Singleton(const Singleton &);           // 禁止复制实例
    Singleton operator=(const Singleton &); // 禁止赋值实例
};

Singleton *Singleton::instance = nullptr;

int main() {
    Singleton *instance = Singleton::getInstance();
    instance->printMessage();
    return 0;
}

3.单例和智能指针share_ptr结合

代码

cpp 复制代码
#include <iostream>
#include <memory>

class Singleton {
  public:
    static std::shared_ptr<Singleton> getInstance() {
        if (!instance) {
            instance = std::shared_ptr<Singleton>(new Singleton());
        }
        return instance;
    }

    void printMessage() {
        std::cout << "hello world!" << std::endl;
    }

  private:
    Singleton() {}                          // 禁止外部创建实例
    Singleton(const Singleton &);           // 禁止复制实例
    Singleton operator=(const Singleton &); // 禁止赋值实例

    static std::shared_ptr<Singleton> instance;
};

std::shared_ptr<Singleton> Singleton::instance = nullptr;

int main() {
    std::shared_ptr<Singleton> instance = Singleton::getInstance();
    instance->printMessage();
    return 0;
}

4.单例和std::call_once结合

编译运行:

代码

cpp 复制代码
#include <iostream>
#include <mutex>

class Singleton {
public:
    static Singleton *getInstance() {
        std::call_once(initFlag, [](){
            instance = new Singleton();
        });

        return instance;
    }

    void printMessage() {
        std::cout << "hello world!" << std::endl;
    }

private:
    static Singleton *instance;
    static std::once_flag initFlag;
    
    Singleton() {} // 禁止外部创建实例
    Singleton(const Singleton &); // 禁止复制实例
    Singleton operator=(const Singleton &); // 禁止赋值实例
};

Singleton *Singleton::instance = nullptr;
std::once_flag Singleton::initFlag;

int main() {
    Singleton *instance = Singleton::getInstance();
    instance->printMessage();
    return 0;
}

5.单例和std::call_once、unique_ptr结合

编译运行

代码

cpp 复制代码
#include <iostream>
#include <mutex>
#include <memory>

class Singleton {
public:
    static Singleton *getInstance() {
        std::call_once(initFlag, [](){
            instance.reset(new Singleton());
        });

        return instance.get();
    }

    void printMessage() {
        std::cout << "hello world!" << std::endl;
    }

private:
    static std::unique_ptr<Singleton> instance;
    static std::once_flag initFlag;

    Singleton() {} // 禁止外部创建实例
    Singleton(const Singleton &); // 禁止复制实例
    Singleton operator=(const Singleton &); // 禁止赋值实例
};

std::unique_ptr<Singleton> Singleton::instance;
std::once_flag Singleton::initFlag;

int main() {
    Singleton *instance = Singleton::getInstance();
    instance->printMessage();
    return 0;
}
相关推荐
自小吃多13 分钟前
PCB Editor软件复制、改变、删除操作笔记
笔记·嵌入式硬件
m0_734571761 小时前
深入理解C++ 析构函数<一>基本概念
开发语言·c++
动词ing2 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
彧azz2 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
t-think2 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners2 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴2 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
David猪大卫4 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
广州山泉婚姻4 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
江湖人称菠萝包4 小时前
【Windows】《深入浅出Windows API程序设计:核心编程篇》笔记-Chapter6-动态链接库
windows·笔记