当前位置: 首页> 汽车> 报价 > 淘宝页面设计模板_品牌网站的推广_搜索关键词排名优化软件_广东seo外包服务

淘宝页面设计模板_品牌网站的推广_搜索关键词排名优化软件_广东seo外包服务

时间:2025/7/15 3:27:50来源:https://blog.csdn.net/weixin_45186425/article/details/142630570 浏览次数: 0次
淘宝页面设计模板_品牌网站的推广_搜索关键词排名优化软件_广东seo外包服务

单例模式是一种创建型模式,核心思想是保证一个类只有一个实例,并对外提供一个全局访问点来访问这个实例
单例模式分为两种:

  • 饿汉式:指的是在程序一加载就创建实例,因此称为饿汉式。这样的好处是没有多线程竞争,缺点是如果后面没有使用到这个单例,就浪费了。
  • 懒汉式:指的是到要用的时候才创建,因此称为懒汉式。这种方式可能会有多线程冲突,因此程序运行中,可能有多个线程都想创建单例,因此需要使用相应的机制避免冲突。程序需要的时候才进行实例化,提高了性能。

单例模式的优点:

  1. 全局控制:保证只有一个实例,就可以严格控制什么时候如何访问
  2. 节省资源:因为只有一个实例,不会创建多个实例,自然就更节省资源了

单例模式实现的几个要点:

  • 私有的构造函数:防止外部直接创建
  • 私有的静态实例变量:保存唯一实例
  • 公有的访问方法:对外的唯一方法来获取实例

下面是一个常见的懒汉式实现方式:

// singleton.h#pragma once
#include <mutex>
using namespace std;class Singleton {
private:Singleton() = default;  // 私有构造,禁止外部构造~Singleton() = default; // 私有析构,禁止外部析构Singleton(const Singleton&) = delete; // 删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; // 删除赋值函数
public:// 外部接口,获取单例实例对象static Singleton* getInstance(); // 释放单例static void deleteInstance();void print();
private:static Singleton* instance; // 唯一的单例对象指针static mutex mtx;
};
// singleton.cpp
#include <iostream>
#include "singleton.h"Singleton* Singleton::instance = nullptr;
mutex Singleton::mtx;
Singleton* Singleton:: getInstance() {// 这两个if称为双重检测if (instance == nullptr) {unique_lock<mutex> lck(mtx);if (instance == nullptr) {instance = new Singleton();return instance;}}return instance;
}void Singleton::deleteInstance() {unique_lock<mutex> lck(mtx);if (instance != nullptr) {delete instance;instance = nullptr;}
}void Singleton::print() { std::cout << "实例地址:" << this << std::endl; }
int main() {Singleton::getInstance(); // 获取单例Singleton::getInstance()->print();return 0;
}

为什么要使用双重检测(上面的两个if)
第一个if很好理解,当实例为空的时候才去创建。第二个if是为了保证只有一个线程拿到锁去创建实例。通俗的说,当进入第一个if后,这时候可能有多个线程来获取锁,如果不第二次判空,就可能创建出多个实例。

饿汉式实现:

class Singleton {
private:Singleton() = default;  // 私有构造,禁止外部构造~Singleton() = default; // 私有析构,禁止外部析构Singleton(const Singleton&) = delete; // 删除拷贝构造函数Singleton& operator=(const Singleton&) = delete; // 删除赋值函数
public:// 外部接口,获取单例实例对象static Singleton* getInstance() {return instance;}void deleteInstance() {if (instance != nullptr) {delete instance;instance = nullptr;}}void print() { std::cout << "实例地址:" << this << std::endl; }
private:static Singleton* instance;
};
// 程序一启动就创建,没有多线程冲突
Singleton* Singleton::instance = new Singleton();int main() {Singleton::getInstance();Singleton::getInstance()->print();return 0;
}

更多的单例模式实现方式可参考:
https://blog.csdn.net/unonoi/article/details/121138176

关键字:淘宝页面设计模板_品牌网站的推广_搜索关键词排名优化软件_广东seo外包服务

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: