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;
}
相关推荐
咖啡里的茶i3 分钟前
Vehicle友元Date多态Sedan和Truck
c++
WaaTong5 分钟前
《重学Java设计模式》之 单例模式
java·单例模式·设计模式
海绵波波1079 分钟前
Webserver(4.9)本地套接字的通信
c++
黑叶白树12 分钟前
简单的签到程序 python笔记
笔记·python
@小博的博客15 分钟前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
幸运超级加倍~1 小时前
软件设计师-上午题-15 计算机网络(5分)
笔记·计算机网络
爱吃喵的鲤鱼1 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
7年老菜鸡2 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Ni-Guvara2 小时前
函数对象笔记
c++·算法
似霰2 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder