单例模式

全局静态变量实现饿汉式单例模式

饿汉式实现方式是线程安全的。

#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++实现的更多相关文章

  1. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  2. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  3. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  4. java设计模式之--单例模式

    前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...

  5. 设计模式C#合集--单例模式

    单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...

  6. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  7. GOF23设计模式之单例模式

    ·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...

  8. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

  10. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

随机推荐

  1. gcc系列工具 介绍

    编译器相关知识学习 GNU GCC简介 GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言.多种优化选项并且能够支持分步编译.支持多种反汇编方式.支持多种调试信息格式,目前支持X86. ...

  2. “古剑山”初赛Misc 幸运饼干

    "古剑山"初赛Misc 幸运饼干 考点:Chrome的Cookies解密 赛中思路 bandzip极限压缩hint.jpg后打明文攻击 压缩包密码:sv@1v3z ┌──(root ...

  3. PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践

    大家好,我是码农先森. 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念.PHP 服务端和前端 HTML.CSS.JS 代码混合式开发,也不分前端.后端程序员,大家都是全干工程师.随 ...

  4. 【java深入学习第2章】Spring Boot 结合 Screw:高效生成数据库设计文档之道

    在开发过程中,数据库设计文档是非常重要的,它可以帮助开发者理解数据库结构,方便后续的维护和扩展.手动编写数据库设计文档不仅耗时,而且容易出错.幸运的是,可以使用Spring Boot和Screw来自动 ...

  5. MobaXterm是一款功能强大的远程SSH利器,是您远程计算机的终极工具箱

    MobaXterm 是一款功能强大的远程终端应用,可以用于 Windows 系统上的 SSH.Telnet.RDP.VNC 等远程登录.它支持多种会话类型,拥有强大的终端功能,还支持 X11 图形界面 ...

  6. [oeasy]python0037_电传打字机_打印头_print_head_carriage_词源

    换行回车 回忆上次内容 上次我们 diy了 自己的小动物 还可以 让小动物 变色.报时 还可以 说些话 这很亚文化 很酷炫的亚文化 不是吗? 回忆一下 最开始 研究报时 的 时候 回到 本行行头 的 ...

  7. [oeasy]python0022_框架标题的制作_banner_结尾字符串_end

    ​ 结尾字符串(end) 回忆上次内容 ​python3​​ 的程序是一个 5.3M 的可执行文件 ​​python3​​ 里面存的是 cpu 指令 可以执行的那种 我们可以把指令对应的汇编找到 ​​ ...

  8. 使用maven搭建父工程与子工程

    父/子工程的作用: 1.依赖管理 2.配置信息共享 3.模块化 4.版本控制 5.提高重用性可维护性 什么是dependencyManagement: maven中的一个元素,用于集中管理项目中的依赖 ...

  9. 什么是spring.factories,引入未知模块报错如何解决

    对于maven中引入其他外部包加入容器的过程,需要用到spring.factories spring.factories的作用:将自动配置类与对应的配置类集中在一起,方便springboot自动装配, ...

  10. Bond4配置

    Bongding聚合链路工作模式 > bond聚合链路模式共7种:0-6Mode > bond 0 负载均衡 轮询方式往每条链路发送报文,增加带宽和容错能力.容易出现数据包无序到达的问题, ...