面试复习 设计模式

news/2024/11/8 16:57:42/

1 单例模式

单例模式是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供全局访问点。在C++中,我们可以使用静态成员变量和私有构造函数来实现。

下面是C++的懒汉式和饿汉式单例模式的例子:

1.1 饿汉式(Eager Initialization)单例模式

饿汉式单例模式在程序启动时就创建了唯一的单例,所以不存在多线程同步问题。

class Singleton {
private:static Singleton* instance;Singleton() {}  // 私有化构造函数public:// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {return instance;}
};// 在类外部初始化
Singleton* Singleton::instance = new Singleton();

注意这两句:

    Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;

在C++中,这两个语句被用来禁止类的拷贝。它们是删除函数(deleted function)的特殊类型。当一个函数被声明为删除的时候,编译器将不允许该函数被调用。

具体到你提供的例子:

Singleton(const Singleton&) = delete; 这个语句禁止了复制构造函数。也就是说,你不能创建一个新的Singleton对象作为旧的Singleton对象的复制。例如,假设s1是一个Singleton对象,以下代码是不合法的: Singleton s2 = s1;

Singleton& operator=(const Singleton&) = delete; 这个语句禁止了赋值运算符。也就是说,你不能将一个Singleton对象赋值给另一个。例如,假设s1和s2都是Singleton对象,以下代码是不合法的: s1 = s2;

将函数声明为private和声明为delete在C++中有着不同的含义,主要区别如下:

  1. Private Functions:当你将一个函数定义为private时,意味着这个函数只能在其所属的类(包括这个类的友元类和函数)中被访问和调用。尝试在类外部访问或调用这个函数会导致编译错误。私有函数通常用于在类内部执行某些操作,而这些操作对类的使用者来说是不可见的。
class MyClass {
private:void myPrivateFunction() { // this function can only be accessed within MyClass}};
  1. Deleted Functions:你可以将一个函数定义为delete来明确表示该函数是禁止使用的。这通常用于禁止某些默认生成的函数,例如复制构造函数或赋值运算符,以防止对象的复制或某些其他不希望看到的行为。如果试图调用被删除的函数,会导致编译错误。
class MyClass {
public:MyClass(const MyClass&) = delete;  // Disallow copyingMyClass& operator=(const MyClass&) = delete;  // Disallow assignment
};

总的来说,两者都可以避免函数的误用,但应用的上下文和方式有所不同。将函数声明为private是为了在类的外部隐藏它,而将函数声明为delete是为了完全禁止其使用。

1.2 懒汉式(Lazy Initialization)单例模式

懒汉式单例模式在第一次被调用时才创建单例。但是,这种方式需要考虑到多线程环境下的线程安全问题。下面的代码使用了双检锁(Double-Checked Locking)来确保线程安全。

#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {}  // 私有化构造函数public:// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;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;

这里std::lock_guard<std::mutex> lock(mtx); 这一行代码的作用是对 mtx 这个互斥量(锁)进行上锁。对互斥量上锁可以防止多个线程同时访问同一段临界区代码,这样就可以避免数据竞态和其它并发问题。

std::lock_guard 是 C++11 中引入的一个 RAII 风格的锁管理类,它在构造函数中接收一个 std::mutex 并立即对其进行上锁,然后在析构函数中自动解锁。所以我们通常会将其在需要进行线程同步的代码块之前创建,一旦超出其生存期(即离开这个作用域),它就会自动解锁,保证了锁必定会被释放,从而避免了死锁。

在这个例子中,使用双检查锁模式(DCL, Double-Checked Locking Pattern)来实现 Singleton 设计模式,目的是为了在多线程环境下安全且高效地创建单实例对象。第一次检查 instance == nullptr 是为了避免在实例已经创建了之后还每次都要去获取锁,这样可以提高程序的运行效率;第二次检查是为了在多个线程同时通过了第一层检查并等待获取锁的时候,确保只有一个线程能够创建实例。


http://www.ppmy.cn/news/590618.html

相关文章

Jmeter性能测试

一、jmeter多并发 1.线程设置&#xff1a; 线程数——多少个虚拟用户 ramp_up时间(秒)——时间&#xff0c;设置时间内将线程都跑完 循环次数——勾选永远&#xff0c;就一直跑&#xff0c;直到手动停止&#xff1b;输入数字&#xff0c;就是循环多少次 2.jmeter逻辑分支控制…

Spring Cloud 疑难杂症之 CompletableFuture 与 Openfeign 一起使用的问题

CompletableFuture 与 Openfeign 一起使用的问题 问题描述问题解决 问题描述 直接错误信息 Could not find class [org.springframework.boot.autoconfigure.condition.OnPropertyCondition] java.util.concurrent.CompletionException: org.springframework.beans.factory.B…

SSMP整合案例(7) MybatisPlus快速service业务层开发

上文 SSMP整合案例(6) 业务service层逻辑编写我们创建并编写了service业务层代码 但是 这样一个一个去写 确实是有点麻烦 重复性工作 但其实这个已经有人帮我们考虑好了 MP就帮我们做了一个 service快捷开发的方式 我们在项目中的service包下创建一个接口 叫 IBookService 其实…

大势智慧软硬件技术答疑第五期

1.控制点误差表达到多少就可以&#xff1f; 答&#xff1a;水平和高程误差在0.01左右就可以&#xff0c;图示精度是满足的。 2.三维影像有颜色&#xff0c;为什么生成的是二维影像是黑色的&#xff1f; 答&#xff1a;使用dasviewer的工具-输出正射图再试试。 3.最新模方对ps版…

dnf手游服务器维护时效,dnf手游延期最新公告 dnf手游延期正真原因

dnf手游延期的最新公告&#xff0c;dnf手游延期的真实原因到底是什么&#xff0c;网上消息纷飞玩家到底相信谁&#xff0c;本期小编就为大家介绍一下dnf手游跳票的原因猜想集合&#xff0c;希望对于各位有所帮助。 腾讯dnf手游上线延期最新公告 腾讯旗下的地下城与勇士工作室在…

全网最新超详细的【Axure】Axure RP 10的下载、安装、中文字体、授权【2023年】

文章目录 1. 文章引言2. 下载Axure103. 安装Axure104. Axure10中文5. 解决axure弹框更新的问题6. 重要备注7. Axure10授权 1. 文章引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择了Axure。 接下来&…

DNF HTML

<!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>◆&#xfe64;艾尚&#xfe65;//CheatEngine \\ 唯一官方资料网盘 ℡&#xff1a;dnfce.cccpan.com</titl…

联想绿色驱动,绿色时钟屏保Fliqlo,强力卸载工具HiBit Uninstaller 便携绿色版

联想绿色驱动 联想绿色驱动2.7版&#xff0c;去除了后台服务与广告程序 下载地址&#xff1a; https://zhaooolee.cowtransfer.com/s/34189f7d89c143 绿色时钟屏保Fliqlo 极简主义时钟屏保Fliqlo是一款简约的个性化软件。 它是一个时钟屏保&#xff0c;可让您将台式机或笔记本电…