单例模式C++实现
单例模式

全局静态变量实现饿汉式单例模式
饿汉式实现方式是线程安全的。
#include using namespace std;
/* 饿汉式单例模式 */
class SingleObject{
private:
static SingleObject instance;
SingleObject(){
std::cout << "Singleton instance created." << std::endl;
}
public:
static SingleObject get_instance(){
return instance; //非静态成员是不存在,是无法返回实例的
}
void show_message();
};
SingleObject SingleObject::instance;
int main(){
cout << "---------主线程开始---------" << endl;
SingleObject::get_instance().show_message();
cout << "---------主线程结束---------" << endl;
return 0;
}
void SingleObject::show_message(){
cout << "完成了单例模式" << endl; }
局部静态变量实现懒汉单例模式
这种也是线程安全的单例模式实现,实现原则是局部静态变量实现,返回引用
//更简单的线程安全初始化
#include using namespace std;
class SingleObject{
private:
SingleObject(){
std::cout << "Singleton instance created." << std::endl;
}
public:
//这里返回类型为引用可以避免对对象的复制,以及拷贝构造函数和析构函数的调用,开销小。
static SingleObject& get_instance(){
static SingleObject instance;//局部静态变量实现单例模式
return instance; //非静态成员是不存在,是无法返回实例的
}
void show_message();
};
int main(){
cout << "---------主线程开始---------" << endl;
SingleObject& my_instance = SingleObject::get_instance();
my_instance.show_message();
cout << "---------主线程结束---------" << endl; return 0;
}
void SingleObject::show_message(){
cout << "完成了单例模式" << endl;
}
指针实现懒汉单例模式
此方式未加互斥锁,是不线程安全的
#include <iostream>
using namespace std;
/* 饿汉式单例模式 */
class SingleObject
{
private:
static SingleObject *instance; // 通过指针延迟初始化
SingleObject() { std::cout << "Singleton instance created." << std::endl; }
public:
static SingleObject* get_instance()
{
if (instance == nullptr) //多线程在执行判断条件时,可能同时发现都是nullptr,同时实例化多个对象。线程不安全
instance = new SingleObject();
return instance; //实例的指针
}
void show_message();
};
SingleObject* SingleObject::instance = nullptr;
int main()
{
cout << "---------主线程开始---------" << endl;
SingleObject* instance = SingleObject::get_instance();
(*instance).show_message();
cout << "---------主线程结束---------" << endl;
return 0;
}
void SingleObject::show_message()
{
cout << "完成了单例模式" << endl;
}
指针加互斥量实现懒汉单例模式
这种互斥量加锁实现方式是线程安全的
#include <iostream>
#include <mutex>
/* 饿汉式单例模式 */
class SingleObject
{
private:
static SingleObject *instance; // 通过指针延迟初始化
SingleObject() { std::cout << "Singleton instance created." << std::endl; }
static std::mutex mtx;//新建一个互斥量,预备实现线程安全
public:
static SingleObject* get_instance()
{
if (instance== nullptr){
std::lock_guard<std::mutex> lock(mtx);
if(instance == nullptr)
instance = new SingleObject();
}
return instance; //实例的指针
}
void show_message();
};
SingleObject* SingleObject::instance = nullptr; //指针初始化
std::mutex SingleObject::mtx;//初始化 互斥锁
int main()
{
std::cout << "---------主线程开始---------" << std::endl;
SingleObject* instance = SingleObject::get_instance();
(*instance).show_message();//或者使用instance->show_message()
std::cout << "---------主线程结束---------" << std::endl;
return 0;
}
void SingleObject::show_message()
{
std::cout << "完成了单例模式" << std::endl;
}
单例模式C++实现的更多相关文章
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- java设计模式之--单例模式
前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...
- 设计模式C#合集--单例模式
单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
随机推荐
- python重拾第十二天-sqlalchemy ORM
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...
- 79元国产ARM+DSP平台FFT实测分享
T113-i国产ARM+DSP架构介绍 创龙科技SOM-TLT113是一款基于国产全志T113-i双核ARM Cortex-A7 + HiFi4 DSP + 玄铁C906 RISC-V异构多核处理器 ...
- TI AM64x工业核心板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)
1 核心板简介 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F设计的多核工业级核心 ...
- .Net Core WebAPI Swagger Failed to load API definition
1.错误现象 1.1.写完一个测试API,Ctrl+F5运行,提示错误: Failed to load API definition.(如下图) 1.2.点击 http://localhost:516 ...
- Java接口如何动态返回指定的对象字段属性
经常遇到的问题 在实际得开发过程中,我们经常会遇到以下场景,我们后端请求某个接口后获取到得数据,不希望将所有字段都返回给前端,那么我们需要封装,或者过滤一些不必要得字段后返回给前端. 不完美的解决方案 ...
- rem适配布局
没有一张图解决不了的事 https://www.processon.com/mindmap/5e3a589be4b021dc2899f511 <link rel="stylesheet ...
- Java-Response对象设置响应消息
功能:设置响应消息 1.设置响应行 格式:HTTP/1.1 200 OK 设置状态码:setStatus(int sc) 2.设置响应头:setHeader(String name,String va ...
- SSRF结合Redis未授权的打法
目录 SSRF + Redis未授权 案例 怎么构造 redis 数据包? Reference SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称S ...
- 解决方案 | 一个VBA代码里面非常隐蔽的错误:运行时错误“5”:无效的过程调用或参数
1 代码部分 代码功能:实现使用sumatra打开指定pdf指定页码 代码: Sub OpenPDFatPage() Dim PDFFile As String Dim PageNumber As L ...
- 解决IE11兼容问题的一些心得
IE11中,都不支持es6新特性. vue想要兼容IE11不要写箭头函数, UI框架不要写有箭头的回调函数(编译成es5的时候,会通不过), 使用label将es6编译成es5. 使用typescri ...