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

好用的网站模板网页设计模板网站免费

好用的网站模板,网页设计模板网站免费,衡水做网站企业,新浪短网址生成器前言: 博主将从此篇单例模式开始逐一分享23种经典设计模式,并结合C为大家展示实际应用。内容将持续更新,希望大家持续关注与支持。 什么是单例模式? 单例模式是设计模式的一种(属于创建型模式 (Creational Pa…

前言:        

        博主将从此篇单例模式开始逐一分享23种经典设计模式,并结合C++为大家展示实际应用。内容将持续更新,希望大家持续关注与支持。

什么是单例模式?

        单例模式是设计模式的一种(属于创建型模式 (Creational Patterns) ),它确保某个类只有一个实例,并为该实例提供一个全局访问点。它常用于那些在整个系统中只需要一个实例的类,例如配置管理、日志记录、线程池、缓存等。

为什么选择单例模式?

1. 确保唯一性

        有些时候,我们需要确保某个对象在整个系统中只存在一个。这样可以避免因为多次实例化导致的资源浪费或不一致性。

2. 节省资源

        如果一个对象初始化需要大量资源,例如读取配置文件或建立数据库连接,那么多次实例化就可能导致不必要的开销。

3. 提供全局访问点

        这让其他对象可以轻松地访问到该实例,并与之交互。

4. 单例模式的不足:

        万事万物都没有绝对的好,不然也不会有23种设计模式,过度依赖单例模式可能使代码变得紧耦合和难以测试。因此,当考虑使用单例模式时,应当仔细权衡其优点和潜在的问题。        

单例模式的分类?

单例模式的具体实现? 

1. 饿汉式

  • 特点:在类加载时就完成了初始化,静态成员对象的创建是在类加载时完成的。
  • 优点:线程安全(基于类加载机制,避免了多线程同步问题)。
  • 缺点:不是懒加载,可能造成资源浪费。
class Singleton {
private:// Singleton的私有静态实例static Singleton instance;// 私有构造函数确保只能通过getInstance方法来访问Singleton实例Singleton() {}public:// 公共静态方法,用于获取Singleton实例static Singleton& getInstance() {return instance;}
};// 初始化静态的Singleton实例
Singleton Singleton::instance;

2. 懒汉式

  • 特点:在第一次调用时实例化。
  • 优点:懒加载,只有在真正需要对象时才会创建。
  • 缺点:需要处理线程安全问题。
class Singleton {
private:// Singleton的私有静态指针实例static Singleton* instance;// 私有构造函数确保只能通过getInstance方法来访问Singleton实例Singleton() {}public:// 公共静态方法,用于获取Singleton实例。如果实例不存在,就创建一个。static Singleton* getInstance() {if (!instance) { // 判断instance是否为空instance = new Singleton(); // 如果为空,则新建一个Singleton对象}return instance; // 返回Singleton对象的指针}
};// 初始化静态的Singleton指针实例为nullptr
Singleton* Singleton::instance = nullptr;

 3. 懒汉式(带锁)

  • 特点:在首次请求对象时创建实例,但加入了互斥锁以确保线程安全。
  • 优势:懒加载,线程安全。
  • 劣势:每次访问时都需要加锁,可能会有性能开销。
class Singleton {
private:static Singleton* instance;static std::mutex mtx; // 用于同步的互斥锁Singleton() {}public:static Singleton* getInstance() {std::lock_guard<std::mutex> lock(mtx); // 直接锁定if (!instance) {instance = new Singleton();}return instance;}
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

4. 双重检查锁定(DCL, Double Checked Locking)

  • 特点:结合了懒汉式和synchronized同步锁。
  • 优点:懒加载,线程安全,且性能较高。
class Singleton {
private:// Singleton的私有静态指针实例static Singleton* instance;// 用于同步的互斥锁static std::mutex mtx;Singleton() {}public:// 这里使用了双重检查锁定来确保线程安全static Singleton* getInstance() {if (!instance) { // 第一次检查,不加锁std::lock_guard<std::mutex> lock(mtx); // 加锁if (!instance) { // 第二次检查,已加锁instance = new Singleton(); }}return instance; }
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

5. 静态局部变量(C++11)

        利用C++11特性,局部静态变量已经是线程安全的,并且无需额外的锁或同步机制。

class Singleton {
public:// 公共静态方法,用于获取Singleton实例的引用。// 这里利用了局部静态变量的特性,该变量只会初始化一次,并且这个初始化过程在C++11及以上是线程安全的。static Singleton& getInstance() {static Singleton instance;  // 局部静态变量return instance;            // 返回这个局部静态变量的引用}private:// 私有构造函数确保只能通过getInstance方法来访问Singleton实例Singleton() {}
};

6. 使用std::once_flagstd::call_once(C++11及以上):

  • 特点:确保某个代码块只被执行一次。
  • 优势:线程安全,性能较好。
  • 劣势:依赖于C++11及以上版本的特性。
class Singleton {
private:// Singleton的私有静态指针实例static Singleton* instance;static std::once_flag onceFlag;// 私有构造函数Singleton() {}public:// 删除拷贝构造函数和赋值操作符,确保不能拷贝Singleton(const Singleton& other) = delete;Singleton& operator=(const Singleton& other) = delete;// 公共静态方法,用于获取或创建Singleton实例static Singleton* getInstance() {std::call_once(onceFlag, []() {instance = new Singleton();});return instance;}
};// 初始化静态成员
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::onceFlag;

开发中的选择?

在实际开发中,选择单例模式的具体实现通常取决于以下因素:

  1. 线程安全性需求:在多线程应用中,单例模式的实现必须是线程安全的。但如果你知道应用永远不会在多线程环境中运行,你可以选择一个不考虑线程安全的简单实现。

  2. 性能考虑:某些单例实现(例如每次访问时都加锁的懒汉式)可能会对性能产生负面影响。但在现代硬件上,这种影响通常可以忽略不计,除非你的代码在高频、高并发场景下运行。

  3. C++版本:在C++11及更高版本中,局部静态变量的初始化是线程安全的,这使得某些单例实现变得更为简洁和可靠。

基于上述因素,以下是在实际开发中经常使用的单例模式实现:

  1. 局部静态变量(推荐,尤其是C++11及以上):

    这种方法简洁、线程安全,并且无需额外的锁或同步机制。

  2. 双重检查锁定(DCL, Double Checked Locking): 这在C++11之前可能是线程安全的选择,但需要谨慎使用,因为在某些老的编译器和硬件上可能会出现问题。

  3. 使用std::call_oncestd::once_flag: 这是C++11及以上版本提供的线程安全方法,可以确保对象只初始化一次。

  4. 饿汉式: 在程序启动时就创建实例。这种方法简单并且线程安全,但可能会导致不必要的资源浪费,特别是当单例对象很大或初始化成本很高时。

  5. 懒汉式(带锁): 在首次请求时创建实例,并使用互斥锁确保线程安全。这种方式在性能敏感的场景中可能不是最佳选择。

结论:

        单例模式有许多不同的实现,每种实现都有其适用的场景和优缺点。在实践中,选择哪种实现需要根据具体需求和上下文进行权衡。

        本文侧重于介绍单例模式在C++中的使用方法,若读者有不同的的理解和看法,欢迎在评论区留言!

http://www.hengruixuexiao.com/news/47141.html

相关文章:

  • wordpress 手动安装主题宁波seo网络推广选哪家
  • 哪些社交网站做外贸比较好百度搜索关键词推广
  • 衡阳网站优化外贸谷歌优化
  • 如何把旅行社网站做的好看seo快排软件
  • 网站生成器下载独立站seo优化
  • 做h动漫的动漫视频在线观看网站市场营销手段有哪四种
  • 一级a做爰片在线看网站北京seo公司工作
  • 商城网站开发报价济南新站seo外包
  • 东莞网站制作公司大学生网页设计作业
  • 自己做盗号网站在百度如何发布作品
  • 佛山做网站建设优化设计七年级下册语文答案
  • 做网站平台赚钱吗自己做网站需要什么条件
  • 怎么自己购买域名 建设网站唐山公司做网站
  • 织梦网站文章内容模板sem是什么
  • 网站建设预付款个人博客网站
  • 宝山区网站建设百度最新财报
  • 建设摩托车报价及图片优化排名推广技术网站
  • 淮南市城乡建设档案馆网站国外搜索引擎大全不屏蔽
  • 中标公示查询官网seo方法
  • 淘宝的网站怎么做素材网
  • wordpress精品插件宁波seo教程行业推广
  • 如何做提卡网站信息流广告案例
  • 网站开发个人简介范文关键词采集软件
  • 电商沙盘seo裤子关键词青岛网站seo诊断
  • wordpress 旅游预订搜狗关键词优化软件
  • 卓拙科技做网站吗关键词智能优化排名
  • 北仑建设局网站河南网站排名
  • 做网站必须购买空间吗?站长工具无忧
  • wordpress 分类目录 首页windows优化大师手机版
  • 宣城高端网站建设外贸网站平台有哪些