【设计模式—单例模式】

1. 单例模式

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点

2. 应用场景

  • 资源共享:当多个对象需要共享同一个资源时,可以使用单例模式来保证只有一个对象拥有该资源,避免资源冲突。

  • 对象的唯一性:有些对象在系统中只能存在一个实例,例如日志记录器、数据库连接池等。使用单例模式可以确保全局只有一个实例存在,方便统一管理和访问。

  • 惰性初始化:某些对象的创建和初始化过程比较复杂,需要耗费较多的时间和资源。使用单例模式可以延迟对象的创建和初始化,只有在第一次使用时才进行,提高了系统的性能和效率。

  • 控制对象的访问权限:通过单例模式,可以对对象的访问进行控制,只允许特定的对象访问,提高了系统的安全性。

上述应用场景通过gpt生成的:chatgpt

兄弟们如果有gpt使用路子欢迎分享一下

3. 实现方法

  • 将默认构造函数设置为私有,防止其他对象使用单例类的new运算符;
    • 如果在类中显式定义了一个带参数的构造函数,默认的无参构造函数不会被隐式生成;
  • 新建一个静态构建方法作为构造函数,该函数调用私有构造函数来创建对象,保存在一个静态成员变量中,此后所有对于该函数的调用都返回这一缓存的对象;
  • 通过锁来保证在线程安全性;

4. 线程安全实现单例模式

#ifndef __Singleton_H
#define __Singleton_H

#include 
#include 

class Singleton {
public:
    Singleton(Singleton& other) = delete;
    Singleton& operator=(Singleton& other) = delete;
    static Singleton* getInstance(const std::string& value);
    std::string getValue() const { return value; }
private:
    Singleton(const std::string value) : value(value) {};
    ~Singleton() {};

    static Singleton* singleton;
    static std::mutex mutex;
    std::string value;
};

Singleton* Singleton::singleton = nullptr;
std::mutex Singleton::mutex;
Singleton* Singleton::getInstance(const std::string& value) {
    if (singleton == nullptr) { // 减少获取锁的次数,提高性能和效率
        std::lock_guard lock(mutex);
        if (singleton == nullptr) {
            singleton = new Singleton(value);
        }
    }
    return singleton;
}

#endif
#include 
#include 
#include 
#include "Singleton.h"

void threadOOO() {
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    Singleton* singleton = Singleton::getInstance("OOO");
    std::cout << singleton->getValue() << "\n";
}

void threadXXX() {
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    Singleton* singleton = Singleton::getInstance("XXX");
    std::cout << singleton->getValue() << "\n";
}

int main() {
    std::thread t1(threadOOO);
    std::thread t2(threadXXX);
    t1.join();
    t2.join();
    return 0;
}

你可能感兴趣的:(设计模式,开发语言,c++)