C++怎么实现Singleton模式

发布时间:2022-01-13 17:55:54 作者:iii
来源:亿速云 阅读:152

C++怎么实现Singleton模式

Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在C++中,实现Singleton模式有多种方式,本文将详细介绍几种常见的实现方法,并分析它们的优缺点。

1. 最简单的Singleton实现

最简单的Singleton实现方式是使用静态成员变量和静态成员函数。以下是一个基本的实现示例:

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

    void doSomething() {
        // 业务逻辑
    }

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    Singleton(const Singleton&) = delete;            // 删除拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 删除赋值运算符
};

优点:

缺点:

2. 使用指针的Singleton实现

另一种常见的实现方式是使用指针来管理Singleton实例。以下是一个示例:

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

    void doSomething() {
        // 业务逻辑
    }

    static void destroyInstance() {
        if (instance != nullptr) {
            delete instance;
            instance = nullptr;
        }
    }

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    Singleton(const Singleton&) = delete;            // 删除拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 删除赋值运算符

    static Singleton* instance;
};

Singleton* Singleton::instance = nullptr;

优点:

缺点:

3. 线程安全的Singleton实现

为了在多线程环境下安全地使用Singleton模式,可以使用互斥锁来保护实例的创建过程。以下是一个线程安全的实现示例:

#include <mutex>

class Singleton {
public:
    static Singleton* getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void doSomething() {
        // 业务逻辑
    }

    static void destroyInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance != nullptr) {
            delete instance;
            instance = nullptr;
        }
    }

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    Singleton(const Singleton&) = delete;            // 删除拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 删除赋值运算符

    static Singleton* instance;
    static std::mutex mutex;
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

优点:

缺点:

4. 双重检查锁定(Double-Checked Locking)实现

为了减少加锁带来的性能开销,可以使用双重检查锁定(Double-Checked Locking)技术。以下是一个示例:

#include <mutex>
#include <atomic>

class Singleton {
public:
    static Singleton* getInstance() {
        Singleton* tmp = instance.load(std::memory_order_acquire);
        if (tmp == nullptr) {
            std::lock_guard<std::mutex> lock(mutex);
            tmp = instance.load(std::memory_order_relaxed);
            if (tmp == nullptr) {
                tmp = new Singleton();
                instance.store(tmp, std::memory_order_release);
            }
        }
        return tmp;
    }

    void doSomething() {
        // 业务逻辑
    }

    static void destroyInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance != nullptr) {
            delete instance;
            instance = nullptr;
        }
    }

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    Singleton(const Singleton&) = delete;            // 删除拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 删除赋值运算符

    static std::atomic<Singleton*> instance;
    static std::mutex mutex;
};

std::atomic<Singleton*> Singleton::instance(nullptr);
std::mutex Singleton::mutex;

优点:

缺点:

5. 使用std::call_once的Singleton实现

C++11引入了std::call_once函数,可以确保某个函数在多线程环境下只被调用一次。以下是一个使用std::call_once的Singleton实现示例:

#include <mutex>

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

    void doSomething() {
        // 业务逻辑
    }

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    Singleton(const Singleton&) = delete;            // 删除拷贝构造函数
    Singleton& operator=(const Singleton&) = delete; // 删除赋值运算符

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

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

优点:

缺点:

总结

在C++中实现Singleton模式有多种方式,每种方式都有其优缺点。选择哪种实现方式取决于具体的应用场景和需求。如果需要在多线程环境下使用Singleton模式,建议使用std::call_once或双重检查锁定技术来确保线程安全。如果不需要传递参数,最简单的静态局部变量实现方式是最佳选择。

推荐阅读:
  1. Singleton设计模式(单实例)
  2. 设计模式之单例模式:singleton

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ singleton

上一篇:JSON序列化导致Long类型被搞成Integer怎么解决

下一篇:springboot整合quartz定时任务框架的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》