c++的单例模式

devtools/2024/11/9 16:45:26/

单例模式

什么是单例模式

只能创建出一个对象的结构、联合、类叫单例模式。

什么时候需要使用单例模式

1、Windows系统的任务管理器。

2、网络或服务器程序的访问计数器。

3、线程池、数据池,一个程序中只能创建一个线程池或数据池。

单例模式的实现原理

1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。

2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。

3、提供一个静态成员接口,用于获取静态的类对象。

饿汉单例模式

只要程序一运行,就把单例类的类对象创建出来,不管后续是否使用到。

缺点:如果后续程序使用不到单例对象,就造成了资源、时间上的浪费。

优点:线程安全,再多的线程也不可能创建出多个类对象。

懒汉单例

直到调用获取单例类对象的接口才会把对象创建出来。

缺点:如果在多线程情况下,多个线程同时调用对象的获取接口,可能会创建出多个类对象。

优点:如果用不到单例对象就不会真正创建,节约资源和时间。

单例模式的实现原理

1、把构造函数、拷贝构造设置成私有的,不允许创建类对象。

2、在类中声明+定义一个静态的类对象(饿汉单例) 或类对象指针(懒汉单例)。

3、提供一个静态成员接口,用于获取静态的类对象。

练习1:实现饿汉单例模式。

#include <iostream>
using namespace std;
​
class HungrySingle
{// 声明静态对象static HungrySingle obj;
​// 把构造和拷贝构造设置为private,可以防止创建类对象HungrySingle(void) {cout << "创建了类对象" << endl;}HungrySingle(const HungrySingle& that) {}
public:// 只能调用该接口获取静态类对象static HungrySingle& getSingleObject(void){return obj;}void show(void){cout << this << endl;}
};
​
// 定义静态对象
HungrySingle HungrySingle::obj;
​
int main(int argc,const char* argv[])
{cout << "main run ..." << endl;HungrySingle& h1 = HungrySingle::getSingleObject();HungrySingle& h2 = HungrySingle::getSingleObject();HungrySingle& h3 = HungrySingle::getSingleObject();h1.show();h2.show();h3.show();
​return 0;
}

练习2:实现懒汉单例模式。

#include <iostream>
using namespace std;
​
class LazySingle
{static LazySingle* obj;LazySingle(void){cout << "创建单例对象" << endl;}LazySingle(const LazySingle& that){}
public:static LazySingle* getSingleObject(void){if(NULL == obj){obj = new LazySingle;}return obj;}void show(void){cout << this << endl;}
};
LazySingle* LazySingle::obj;
​
int main(int argc,const char* argv[])
{cout << "main run ..." << endl;LazySingle* l1 = LazySingle::getSingleObject();LazySingle* l2 = LazySingle::getSingleObject();LazySingle* l3 = LazySingle::getSingleObject();l1->show();l2->show();l3->show();return 0;
}


http://www.ppmy.cn/devtools/110225.html

相关文章

SQL优化(二)统计信息

收集统计信息 数据库的统计信息非常重要&#xff0c;如果没有正确地收集表的统计信息&#xff0c;或者没有及时地更新表的统计信息&#xff0c;SQL就有可能走错执行计划&#xff0c;也就会出现性能问题。 统计信息主要分为表的统计信息、列的统计信息、索引的统计信息、系统的…

AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级

随着人工智能&#xff08;AI&#xff09;和边缘计算技术的快速发展&#xff0c;两者在安防视频领域的应用日益广泛&#xff0c;为传统安防系统带来了革命性的变革。AI边缘计算技术通过将AI算法和模型部署在边缘设备上&#xff0c;实现了数据处理和智能决策的即时响应&#xff0…

C++设计模式——Memento备忘录模式

一&#xff0c;备忘录模式的定义 备忘录模式是一种行为型设计模式&#xff0c;它允许将对象的状态保存在外部&#xff0c;并在需要时恢复。 备忘录模式允许在不破坏封装性的前提下&#xff0c;捕获并存储一个对象的内部状态&#xff0c;并在需要时将其恢复到之前的状态。 在…

数据库中的主键和外键分别是什么意思?

让我们来聊聊数据库设计中非常重要的两个概念——主键&#xff08;Primary Key&#xff09;和外键&#xff08;Foreign Key&#xff09;。这两个概念对于保证数据的一致性和完整性至关重要。 主键&#xff08;Primary Key&#xff09; 主键是一个表中的一个或一组字段&#x…

15 三数之和

解题思路&#xff1a; \qquad 要找到所有和为0的三元组&#xff0c;使用暴力去解的话时间复杂度为 O ( N 3 ) O(N^3) O(N3)&#xff0c;但是这样会超时。若三数之和为0&#xff0c;那么只要知道其中的两个&#xff0c;就可以知道第三个数的值。进而可以想到用map这样的数据结…

Mysql高级篇(中)——SQL性能分析

Mysql高级篇&#xff08;中&#xff09;—— SQL性能分析 一、&#xff08;了解&#xff09;MySQL Query Optimizer 的主要功能和原理二、&#xff08;了解&#xff09;MySQL 常见瓶颈三、关键字 EXPLAIN1、是什么2、基本语法3、EXPLAIN 执行信息详解&#xff08;1&#xff09…

享元模式flyweight

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/flyweight 通过共享多个对象所共有的相同状态&#xff0c; 让你能在有限的内存容量中载入更多对象。享元会将不同对象的相同数据进行缓存以节省内存。 factory里面treeType共用了

GS-SLAM论文阅读笔记--MM-Gaussian

介绍 这是一篇多模态的GS-SLAM&#xff0c;也已经被IROS2024录用。由于多传感器融合的GS-SLAM还是比较少的&#xff0c;所以应该仔细阅读一篇。 文章目录 介绍1.背景介绍2.关键内容2.1 跟踪2.2 重定位2.3 建图2.4总体流程 3.文章贡献 1.背景介绍 传统的SLAM方法往往受到地图…