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

省建设厅执业资格注册中心网站泰安网站建设课程报告

省建设厅执业资格注册中心网站,泰安网站建设课程报告,怎么做展示型网站,WordPress换主题文件夹深入解析单例模式:从思想到C实战实现 一、设计模式与单例模式思想 1.1 设计模式的价值 设计模式是软件工程领域的经验结晶,如同建筑领域的经典蓝图。它们提供了经过验证的解决方案模板,能有效解决以下问题: 提高代码复用性提升…

深入解析单例模式:从思想到C++实战实现

一、设计模式与单例模式思想

1.1 设计模式的价值

设计模式是软件工程领域的经验结晶,如同建筑领域的经典蓝图。它们提供了经过验证的解决方案模板,能有效解决以下问题:

  • 提高代码复用性
  • 提升系统可维护性
  • 增强代码可读性
  • 降低模块耦合度

1.2 单例模式核心思想

单例模式(Singleton Pattern)确保一个类:

  1. 仅有一个实例存在
  2. 提供全局访问点
  3. 严格控制实例化过程

适用场景包括:

  • 配置管理器
  • 日志记录器
  • 线程池
  • 数据库连接池
  • 硬件接口访问

二、C++实现方案对比

2.1 基础懒汉式(线程不安全)


#include <iostream>
using namespace std;
// 基础懒汉模式,非线程安全
class Singleton {
public:static Singleton* getInstance() {if (!instance) {instance = new Singleton();}return instance;}void doSomething() {cout << "Doing something..." << endl;}// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() = default;~Singleton() = default;static Singleton* instance;
};// 初始化静态成员
Singleton* Singleton::instance = nullptr;#include <thread>
#include <vector>void threadFunction(int i) {Singleton* singleton = Singleton::getInstance();cout << "Thread " << i << " Singleton address: " << singleton << endl;singleton->doSomething();
}int main() {const int numThreads = 10;std::vector<std::thread> threads;for (int i = 0; i < numThreads; ++i) {threads.emplace_back(threadFunction, i);}for (auto& thread : threads) {thread.join();}return 0;
}

 运行结果:可以看出非线程安全的,创建了两个实例。

2.2 线程安全双检锁(C++11+)

#include <iostream>
#include <mutex>
#include <thread>
#include <vector>using namespace std;
class ThreadSafeSingleton {
public:static ThreadSafeSingleton* getInstance() {if (!instance) {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new ThreadSafeSingleton();}}return instance;}void doSomething() {cout << "Doing something..." << endl;}private:static ThreadSafeSingleton* instance;static std::mutex mutex;
};// 初始化静态成员
ThreadSafeSingleton* ThreadSafeSingleton::instance = nullptr;
std::mutex ThreadSafeSingleton::mutex;
#include <thread>
#include <vector>
#include "lazy_single_thread_safe.h"void LazySafeThreadFunction(int i) {ThreadSafeSingleton* singleton = ThreadSafeSingleton::getInstance();cout << "Thread Safe" << i << " Singleton address: " << singleton << endl;singleton->doSomething();
}// 线程安全懒汉模式 demo
int main() {const int numThreads = 10;std::vector<std::thread> threads1;for (int i = 0; i < numThreads; ++i) {threads1.emplace_back(LazySafeThreadFunction, i);}for (auto& thread : threads1) {thread.join();}return 0;
}

 运行结果:线程安全。

2.3 现代C++实现(最优方案)


#include <iostream>
using namespace std;/****  饿汉式是否 Lazy 初始化:否是否多线程安全:是描述:这种方式比较常用,但容易产生垃圾对象。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。它基于 classloader 机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
*/
#include <iostream>class EagerSingleton {
public:// 获取单例实例的静态方法static EagerSingleton* getInstance() {static EagerSingleton instance; // 在第一次调用时创建实例return &instance;}// 删除拷贝构造函数和赋值运算符,防止复制EagerSingleton(const EagerSingleton&) = delete;EagerSingleton& operator=(const EagerSingleton&) = delete;// 示例方法void doSomething() {cout << "Doing something..." << endl;}private:// 私有构造函数,防止外部实例化EagerSingleton() {std::cout << "EagerSingleton instance created." << std::endl;}
};

main 调用者:

#include <thread>
#include <vector>
#include "eager_single.h"void EagerSingletonThreadFunction(int i) {EagerSingleton* singleton = EagerSingleton::getInstance();cout << "Thread Safe" << i << " Singleton address: " << singleton << endl;singleton->doSomething();
}// 线程安全懒汉模式 demo
int main() {const int numThreads = 10;std::vector<std::thread> threads2;for (int i = 0; i < numThreads; ++i) {threads2.emplace_back(EagerSingletonThreadFunction, i);}for (auto& thread : threads2) {thread.join();}return 0;
}

运行结果:

方案对比表:

特性基础懒汉式双检锁现代实现
线程安全✔️✔️
延迟初始化✔️✔️✔️
自动析构✔️
C++标准要求-≥11≥11
实现复杂度简单中等简单

三、关键实现细节解析

3.1 线程安全保证

  • 现代实现方案利用C++11的静态变量初始化特性
  • 编译器保证静态局部变量的线程安全
  • 双检锁方案需要内存屏障支持

3.2 资源管理

  • 现代方案自动处理析构
  • 指针方案需要自定义销毁逻辑
  • 可结合智能指针优化:
#include <memory>class SmartSingleton {
public:static SmartSingleton& getInstance() {static auto instance = std::make_shared<SmartSingleton>();return *instance;}// ...其他成员...
};

3.3 继承扩展方案

template <typename T>
class InheritableSingleton {
public:static T& getInstance() {static T instance;return instance;}protected:InheritableSingleton() = default;virtual ~InheritableSingleton() = default;
};class MyLogger : public InheritableSingleton<MyLogger> {friend class InheritableSingleton<MyLogger>;// 具体实现...
};

四、最佳实践与陷阱规避

4.1 使用建议

  1. 优先选择现代实现方案
  2. 明确单例的生命周期
  3. 做好线程安全测试
  4. 考虑依赖注入替代方案

4.2 常见陷阱

  • 循环依赖问题
  • 测试困难(使用虚函数增加可测试性)
  • 多线程环境下的初始化竞争
  • 异常安全性问题

4.3 性能考量

  • 现代方案无锁设计效率最高
  • 双检锁方案需要权衡锁开销
  • 饿汉式初始化可能影响启动速度

五、演进与替代方案

5.1 单例模式演进

  • 多例模式(Multiton)
  • 线程局部单例
  • 集群环境单例

5.2 现代替代方案

  • 依赖注入容器
  • 全局命名空间函数(权衡使用)
  • 服务定位器模式

六、总结

单例模式作为创建型模式的代表,在特定场景下能有效管理系统资源。但需要注意:

  • 不要滥用导致全局状态污染
  • 优先考虑依赖注入等现代方案
  • 关注线程安全和生命周期管理

正确使用单例模式,可以构建出高效、可控的软件系统。但记住,好的架构应该是灵活可扩展的,而不是充满各种全局状态的"单例陷阱"。

示例代码已在GCC 13.1和Clang 16.0测试通过,建议使用C++17及以上标准编译。实际项目中请根据具体需求选择合适的实现方案。


文章转载自:

http://DabLZg80.nwqyq.cn
http://U7I6Ezd8.nwqyq.cn
http://rj1IV8w4.nwqyq.cn
http://4JohXMOO.nwqyq.cn
http://HXYIXVPW.nwqyq.cn
http://RZOyIoZf.nwqyq.cn
http://eazyD4ni.nwqyq.cn
http://qAxqlCQc.nwqyq.cn
http://aVNiq8TX.nwqyq.cn
http://XuLl3Hvb.nwqyq.cn
http://h3sHSqts.nwqyq.cn
http://17WZLJkS.nwqyq.cn
http://RYTYi4hr.nwqyq.cn
http://LJSJg8UY.nwqyq.cn
http://LDotGwH7.nwqyq.cn
http://bpI81GVT.nwqyq.cn
http://3XRILknZ.nwqyq.cn
http://TvEmQlpF.nwqyq.cn
http://Pwz107j1.nwqyq.cn
http://w5zl6yVS.nwqyq.cn
http://vTlxwRTV.nwqyq.cn
http://lMZvJ7cb.nwqyq.cn
http://B4vD26pe.nwqyq.cn
http://dMOsC63x.nwqyq.cn
http://RAgsXoUo.nwqyq.cn
http://3lLUeMhE.nwqyq.cn
http://p7bNR5Kz.nwqyq.cn
http://6sWedd7F.nwqyq.cn
http://gNAkR9V7.nwqyq.cn
http://rGw1E3dL.nwqyq.cn
http://www.dtcms.com/wzjs/756145.html

相关文章:

  • 不建网站可不可以做cpa手机网站源码大全
  • 东莞整合网站建设营销大型门户网站建设方案
  • 温州定制网站建设电话wordpress本地怎么搬家
  • 网站建设与信息安全培训小结公司名称大全二字
  • 陕西住房和城乡建设厅网站6丽江网站建设 莱芜
  • 做AE视频素材在哪些网站上可以找网站建站服务的公司
  • 长岭建设局网站苏州网站建设-中国互联
  • 陕西省建设工程质量安全监督总站网站阳江58同城招聘网
  • phpcms wap网站搭建软件开发工程师绩效考核指标
  • 常熟市建设局网站网站推广计划效果
  • 衡量一个网站的指标建设银行u盾用网站打不开
  • 网页翻译器在线翻译网站优化客户报表
  • 尧都区建设厅官方网站wordpress标签球形
  • 网站架构优化微科技h5制作网站模板下载
  • 浙江省建设厅新网站人员无法查询秀色直播app软件大全
  • 有没有做软件的外包网站wordpress手机发留言
  • 建网站 维护做摄像头模组的网站
  • apmserv搭建多个网站seo如何提高网站排名
  • 建设企业银行网站多少钱网络营销工具包括
  • 怎样建设网站空间五金模具技术支持 东莞网站建设
  • 邯郸市建设局网站政策免费标志在线设计生成
  • 给公司制作网站吗个人网站
  • wordpress应用和lamp郑州百度seo排名公司
  • 深圳专业企业网站制作山东高密网站建设
  • 网站黑名单查询维护网站费用
  • wap网站源码网站建设 发展方向
  • 网站重定向过多厦门建设银行网站
  • 网站内容建设的原则是什么软件开发项目名称
  • 怎么做网站管理系统如何建设网站咨询跳转页面
  • 一般网站是怎么做的内蒙网站建设赫伟创意星空科技