当前位置: 首页 > wzjs >正文

思帽西宁网站建设医院网站前置审批文件

思帽西宁网站建设,医院网站前置审批文件,沈阳犀牛云做网站怎么样,平面设计主要内容单例模式(Singleton Pattern)是设计模式中最简单但也是最常用的一种创建型模式,它确保一个类只有一个实例,并提供一个全局访问点。下面我将从多个维度全面解析C中的单例模式实现。 核心要点:只初始化一次,…

单例模式(Singleton Pattern)是设计模式中最简单但也是最常用的一种创建型模式,它确保一个类只有一个实例,并提供一个全局访问点。下面我将从多个维度全面解析C++中的单例模式实现。

核心要点:只初始化一次,需要有一个静态的getinstance接口 ,使用的时候不需要对象直接通过域名使用

一、基础实现

1. 经典实现(非线程安全)

class Singleton {
private:static Singleton* instance;  // 静态成员变量Singleton() {}              // 私有构造函数~Singleton() {}             // 私有析构函数Singleton(const Singleton&) = delete;            // 禁用拷贝构造Singleton& operator=(const Singleton&) = delete; // 禁用赋值操作符public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
};// 静态成员初始化
Singleton* Singleton::instance = nullptr;

 问题:非线程安全,多线程环境下可能创建多个实例

虽然静态函数还是同一个,但是多次创建会导致内存泄漏(前面创建的实例的静态函数的指针是空的),与及其他多个实例的非静态成员函数同时和一个静态函数交互会导致混乱。

二、线程安全实现

2.1 加锁实现(双重检查锁定)

#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {}~Singleton() {}public:static Singleton* getInstance() {if (instance == nullptr) {  // 第一次检查std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {  // 第二次检查instance = new Singleton();}}return instance;}
};// 静态成员初始化
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

优点:线程安全且效率较高
注意:C++11前可能需要volatile关键字防止指令重排

2.2 C++11局部静态变量实现(最推荐)

class Singleton {
private:Singleton() {}~Singleton() {}public:static Singleton& getInstance() {static Singleton instance;  // C++11保证静态局部变量初始化线程安全return instance;}
};

优点

  • 线程安全(C++11标准保证)

  • 自动析构(程序结束时)

  • 实现简单

  • 延迟初始化(首次调用时构造)

三、高级主题

3.1 模板化单例

template<typename T>
class Singleton {
protected:Singleton() = default;~Singleton() = default;public:static T& getInstance() {static T instance;return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 使用方式
class MyClass : public Singleton<MyClass> {friend class Singleton<MyClass>;
private:MyClass() {}  // 构造函数必须私有
};

3.2 单例的销毁时机控制 

class Singleton {
private:Singleton() {}~Singleton() {}static Singleton& getRawInstance() {static Singleton instance;return instance;}public:static Singleton& getInstance() {return getRawInstance();}// 手动销毁接口(谨慎使用)static void destroyInstance() {// 实际无法真正销毁,但可以重置状态}
};

 3.3 多环境适配单例

 

#ifdef _WIN32#include <windows.h>
#else#include <pthread.h>
#endifclass CrossPlatformSingleton {
private:static CrossPlatformSingleton* instance;#ifdef _WIN32static CRITICAL_SECTION cs;#elsestatic pthread_mutex_t mutex;#endifCrossPlatformSingleton() {#ifdef _WIN32InitializeCriticalSection(&cs);#elsepthread_mutex_init(&mutex, nullptr);#endif}public:static CrossPlatformSingleton* getInstance() {if (instance == nullptr) {#ifdef _WIN32EnterCriticalSection(&cs);#elsepthread_mutex_lock(&mutex);#endifif (instance == nullptr) {instance = new CrossPlatformSingleton();}#ifdef _WIN32LeaveCriticalSection(&cs);#elsepthread_mutex_unlock(&mutex);#endif}return instance;}
};

四、单例模式的变体

4.1 多例模式(限制实例数量)

class Multiton {
private:static const int MAX_INSTANCES = 3;static std::array<Multiton*, MAX_INSTANCES> instances;static std::mutex mtx;static int nextIndex;Multiton() {}public:static Multiton* getInstance() {std::lock_guard<std::mutex> lock(mtx);if (nextIndex < MAX_INSTANCES) {instances[nextIndex] = new Multiton();return instances[nextIndex++];}return instances[rand() % MAX_INSTANCES];  // 随机返回一个实例}
};

4.2 线程局部单例(每个线程一个实例)

class ThreadLocalSingleton {
private:ThreadLocalSingleton() {}public:static ThreadLocalSingleton& getInstance() {thread_local ThreadLocalSingleton instance;return instance;}
};

五、单例模式的优缺点

优点:

  1. 严格控制实例数量

  2. 全局访问点方便管理

  3. 延迟初始化节省资源

  4. 避免频繁创建销毁对象

缺点:

  1. 违反单一职责原则(同时控制生命周期和业务逻辑)

  2. 难以扩展(需要修改代码而非配置)

  3. 隐藏类之间的依赖关系

  4. 对单元测试不友好(难以mock)

  5. 在多线程环境中需要特别注意线程安全

六、使用场景

  1. 配置管理:全局配置只需要一个实例

  2. 日志系统:整个应用共享一个日志管理器

  3. 设备驱动:如打印机假脱机系统

  4. 缓存系统:全局内存缓存

  5. 线程池:通常只需要一个线程池实例

七、现代C++最佳实践

  1. 优先使用局部静态变量实现(C++11及以上)

  2. 考虑使用std::call_once作为替代方案

class Singleton {
private:static std::once_flag onceFlag;static Singleton* instance;Singleton() {}public:static Singleton& getInstance() {std::call_once(onceFlag, []() {instance = new Singleton();});return *instance;}
};

3.对于需要参数的单例,可以使用以下模式: 

class Config {
private:std::string configPath;Config(const std::string& path) : configPath(path) {}public:static Config& getInstance(const std::string& path = "") {static Config instance(path.empty() ? "default.conf" : path);return instance;}
};

 

八、单例模式与依赖注入

在现代软件设计中,依赖注入(DI)框架常被用来替代单例模式,因为它能更好地解耦和测试:

// 使用依赖注入框架(如Google Fruit)
fruit::Injector<MyService> injector(getMyServiceComponent);
MyService* service = injector.get<MyService*>();

这种方式的优点是可以更容易地替换实现和进行单元测试。

总结

C++中的单例模式实现需要考虑线程安全、生命周期管理、可测试性等多方面因素。在C++11及以上版本中,推荐使用局部静态变量的实现方式,它简洁、安全且高效。对于更复杂的需求,可以考虑模板化单例或依赖注入等高级技术。


文章转载自:

http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://00000000.qstkk.cn
http://www.dtcms.com/wzjs/569654.html

相关文章:

  • 网站模块介绍丽水市住房与城乡建设局网站
  • 班级网站建设的内容国内永久免费crm系统网站推荐大全
  • 做网站还能赚钱吗招商加盟网站开发
  • wordpress全站搜索网络规划设计师考试通过率
  • 大丰做网站的公司食品公司网站源码
  • 网站建设佛温州外经贸局网站
  • WordPress网站生成小程序方案案例网站
  • 在电脑新建网站站点厦门图书馆网站建设
  • 做单屏网站 高度是多少广东一站式网站建设推荐
  • 标准营销型网站定做价格刷粉网站推广便宜
  • 网站所有权包括选择网站模板注意事项
  • 万网虚拟主机两个网站宝塔linux面板官网
  • 专门做旅游的视频网站唯尚广告联盟平台
  • 网站添加视频代码wordpress 本地打开很慢
  • 自己如何做网站教程网页开发工具
  • 网站开发与实践题库wordpress用什么系统好
  • 丹东做网站公司东莞信科网站建设
  • 网站开发公司的选择wordpress 自定义注册页面模板
  • 网站服务器如何更改解析网站建设的功能有哪些方面
  • 网站做专业团队南宁网站建设南宁
  • 网站建设软件开发工作室整站模板如何注册网站域名
  • 那个做头像的网站好网站续费管理系统
  • 360免费建站软仵下载沈阳学网站制作学校
  • 关于要求建设网站的请示wordpress 多模板下载
  • 专门做酒的网站合肥响应式网站建设
  • 网站的跟目录现货平台在中国合法吗
  • 北京专业网站建设网站推广wordpress 模版制作
  • 国外上市网络公司排名德阳网站怎么做seo
  • 团支部智慧团建网站公众号运营总结
  • wordpress前台登录框南京网站优化方案