面向对象单例模式

2023-05-16

单例模式: 一个类只能创建一个对象。

class A 
{
private:
	A() {
		a = new A();
	}
	static A *a; // 创建一个静态对象,并对外不可访问
public:
	// 通过静态函数返回一个A对象
	static A* getA() {
		return a;
	}
};
A* A::a = NULL;

int main()
{
	A* sp = A::getA(); // 获取一个单例对象
	return 0;
}

将构造方法私有化,提供一个静态方法将创建好的对象返回给调用者。

懒汉式

// 懒汉式
class Singleton_lazy
{
private:
	Singleton_lazy() { }
	static Singleton_lazy* pSingleton;

public:
	static Singleton_lazy* getInstance() {
		if (pSingleton == NULL) {
			pSingleton = new Singleton_lazy();
		}
		return pSingleton;
	}
};
Singleton_lazy* Singleton_lazy::pSingleton = NULL;

每当调用静态方法获取的时候才去创建一个对象出来,所以叫懒汉式。

饿汉式

// 饿汉模式
class Singleton_hungry
{
private:
	Singleton_hungry() { }
	static Singleton_hungry* pSingleton;
public:
	static Singleton_hungry* getInstance() {
		return pSingleton;
	}
};
Singleton_hungry* Singleton_hungry::pSingleton = new Singleton_hungry();

饿汉式的构造先于main函数执行,提前就创建好了一个对象等着获取,所以叫饿汉式。

单例对象释放

单例模式在整个程序中只生成一个对象在堆区,在程序结束的时候,系统会自动回收,所以不需要考虑释放内存。

如果非要手动释放,那就写个私有的析构吧。

单例对象遇到多线程

懒汉模式: 在调用者调用静态获取对象的方法时,多线程情况下有 if 判断都为 NULL的可能,那么就创建了不止一个对象,违背了“单例”。所以懒汉式是线程不安全的。

饿汉模式: 先创建好了一个对象等着调用者去调用,此时这个对象在多线程下作为竞争资源。所以在多线程模式下创建单例模式使用饿汉模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象单例模式 的相关文章

  • ArduPlane plane 部分功能与代码移植到 GCC(Atmel studio 6.2)版本的程序源代码 HelloPilot

    几年前由于当时 ArduPlane xff08 Ver2 76 xff09 的开发环境为arduino ide 开发尤其是调试环境非常不友好 xff0c 要进行程序调试及跟踪非常不方便 xff0c 同时出于学习掌握arduplane代码原理
  • 简单的说说飞控硬件研发过程中的各种坑

    我们的飞控 xff0c 从当初第一个概念设计到现在 xff0c 历时好几年 xff0c 目前经过上百架次的试飞 xff0c 功能已经基本完备 回首前面走过的历程 xff0c 不说尸横遍野吧 xff0c 至少也是血泪斑斑 有无数的坑需要投入大
  • 1、无人系统控制站软件开发平台 CSS(Control Station Studio)概述

    1 初衷 在CSS之前 xff0c 通过参与开发数个大中型无人机地面控制站项目 xff0c 在GCS xff08 Ground Control Station xff09 设计与实现方面积累了一些经验和感悟 在先前的开发过程中 xff0c
  • .Net6.0系列-7 .Net 6LinQ(三)常用扩展方法

    一 投影 把集合中的每一项转换为另一种类型使用的是Select 方法 where 的返回集合是Enumerable 返回的是T的全部字段 而Select是可以返回集合的任意需要的字段 find 是在lamada表达式中的使用 以上两个是Li
  • 一款适于作为飞行试验平台的小四轴设计

    四轴虽小 xff0c 但也是第7版改进设计了 xff0c 定型了 xff01 优点 1 安全性高 作为实验平台 xff0c 最大的风险来自于失控 小四轴 xff08 是的 xff0c 它现在还没名字 xff09 可靠的旋翼保护圈以及其他保护
  • 上手Nucleo H743ZI 开发板下载失败问题解决方法

    准备研究Stm32H7 xff0c 买了块Nucleo H743ZI开发板回来研究 之前一直使用的是stm32F4 xff0c 开发环境为keil 5 13 43 STM32F4xx DFP 2 10 0 st linkV2 开工之前仔细读
  • 固定翼武德充沛,多旋翼费拉不堪

    实际飞行测试 同样的动力组合 xff1a 2205电机 43 5030 3叶桨 同样的动力电池 xff1a 2200ma xff0c 3s xff0c 20c 基本一致的起飞全重 xff1a 固定翼680g xff0c 多轴700g 续航时
  • PH7系统简介

    PH7系统简介 PH7是什么 xff1f 狭义的PH7是一套以无人机飞控为典型应用案例 xff0c 涵盖无人车或船 GCS数据采集 伺服控制 AHRS 地面模拟仿真系统等的通用控制器代码框架 xff0c 该框架以Stm32CubeMx生成代
  • 小型无人机的布线与布局设计

    小型无人机的布线与布局设计 xff0c 似乎看上去像是在总体设计当中一个细枝末节 xff0c 是往往会被忽略掉的部分 但实际上 xff0c 布线与布局虽然不像飞控算法设计 飞行平台气动设计是总体设计当中最核心和最重要的部分 xff0c 但却
  • Bread Board Pilot 即将发布

    Bread Board Pilot xff08 简称BBP xff09 为基于 PH7 代码框架 xff08 PH7 系统简介 xff09 的一款飞控快速原型开发板 相比传统飞控板 xff0c BBP 的硬件设计具有以下突出特点 xff1a
  • Mavlink 协议硬解析主要代码

    int MAVLinkProtocol ParseMsg BYTE arMsgBuf MSGVALUE pMavMsg CString amp strMsgText Function Parameters arMsgBuf 为完整的 mav
  • 网络调试助手(NetAssist)不能正常创建TCP Serve连接问题

    一 问题由来 第一次使用网络调试助手 xff08 NetAssist xff09 建立服务端 xff08 TCP Server xff09 连接时碰到链接失败的问题 xff0c 如图所示 xff0c 其原因在于本地主机端口8080被其他进程
  • postman调用J-WSSE认证方式接口

    J WSSE认证方式的内容包括 xff1a 用户名 密码 nonce 时间戳 nonce是一个随机字符串 xff1b 时间戳 Created 为W3DTF格式 xff1b 密码创建方式为 xff1a PasswordDigest 61 Ba
  • ROS 三种通信编程入门:【话题通信】【服务通信】【动作通信】

    目录 一 创建工作空间二 ROS通信编程2 1 话题编程2 2 服务编程2 3 动作编程 五 总结六 参考资料 本文内容 xff1a 学习古月居 ROS 教学课件和相关视频 xff0c 练习课件上的话题通信 服务通信编程代码示例 一 创建工
  • .Net6.0系列-8 依赖注入(一)

    依赖注入 Dependency Injection DI 是控制反转 Inversion of Control IOC 思想的实现方式 依赖注入简化模块的组装过程 降低模块之间的耦合度 DI的几个概念 服务 Service 和框架请求之后返
  • Git学习记录

    Git学习记录 概念 xff1a 两个人同时参与开发 xff0c 那么就把这个项目放在一个公共的地方 xff0c 需要的时候都可以去获取 xff0c 有什么改动 xff0c 都可以进行提交 Git就是这样一个免费 开源的分布式版本控制系统
  • Maven学习记录

    Maven学习笔记 导读 xff1a Maven 是专门用于构建和管理Java相关项目的工具 Maven的主要用处 xff1a 项目结构一致统一维护jar包 xff0c 使jar包实现共享 流程 xff1a idea配置 打开File gt
  • 软件需求总结(总)

    软件需求工程复习归纳 课程目标 xff1a 系统地掌握需求开发和管理的技术和方法掌握需求分析和建模的技术和方法掌握需求规格的验证和评审等要点和方法结合具体的实际项目开发 xff0c 解决软件项目开发中的有关需求的各种问题能够适应目前各种应用
  • C++: extern关键字功能和用法研究

    今天遇到在aaa cpp文件中定义如下函数 xff1a 在bbb h文件中有以下声明 xff1a 但在aaa cpp中没有包含相关头文件 xff0c 那么为什么可以调用相关函数 xff0c 这就是extern的功能 1 extern的功能一

随机推荐