Android12之模板类单例模式实现原理(一百五十二)

news2024/12/24 10:04:45

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

文章目录

    • 1.前言
    • 2.Android使用模板类单例模式例子
      • <1>.实例化
      • <2>.android源码使用例子
    • 3.实现模板类单例模式

1.前言

本篇目的:通过模板实现单例模式,帮助读者理解模板和单例模式。

2.Android使用模板类单例模式例子

<1>.实例化

frameworks/av/media/libaaudio/src/binding/AAudioBinderClient.cpp

ANDROID_SINGLETON_STATIC_INSTANCE(AAudioBinderClient);

AAudioBinderClient::AAudioBinderClient() : AAudioServiceInterface(), Singleton<AAudioBinderClient>() {
    gKeepBinderClient = this; // so this singleton won't get deleted
    mAAudioClient = new AAudioClient(this);
    ALOGV("%s - this = %p, created mAAudioClient = %p", __func__, this, mAAudioClient.get());
}

AAudioBinderClient继承自AAudioServiceInterface和Singleton类。
而Singleton为模板类单例模式。

<2>.android源码使用例子

frameworks/av/media/libaaudio/src/core/AudioStreamBuilder.cpp

stream = new AudioStreamInternalCapture(AAudioBinderClient::getInstance(), false);

调用:AAudioBinderClient::getInstance()获取AAudioBinderClient类实例化对象。

3.实现模板类单例模式

#include <iostream>
#include <stdlib.h>

using namespace std;

template <typename TYPE>
class Singleton{
public:
  static TYPE& getInstance() {
    TYPE* instance = sInstance;
    if (instance == nullptr) {
      instance = new TYPE();
      sInstance = instance;
    }
    return *instance;
  }

protected:
  Singleton() {
    printf("%s(), line = %d\n",__FUNCTION__,__LINE__);
  }
  ~Singleton() {
    printf("%s(), line = %d\n",__FUNCTION__,__LINE__);
  }

private:
  Singleton(const Singleton&);
  Singleton& operator = (const Singleton&);
  static TYPE* sInstance;
};

#define SINGLETON_STATIC_INSTANCE(TYPE)				\
  template<> TYPE* Singleton< TYPE >::sInstance(nullptr);	\
  template class Singleton< TYPE >;

class/*struct*/ SingleTest : public Singleton<SingleTest> {
public:
  SingleTest(){
    printf("%s(), line = %d\n",__FUNCTION__,__LINE__);
  }
  ~SingleTest(){
    printf("%s(), line = %d\n",__FUNCTION__,__LINE__);
  }
  unsigned int contents;
};

SINGLETON_STATIC_INSTANCE(SingleTest);

int main(){

  //1.单例模式
  SingleTest *s1 = &SingleTest::getInstance();
  SingleTest *s2 = &SingleTest::getInstance();
  if (s1 == s2) {
    cout << "s1 == s2" << endl;
  } else {
    cout << "s1 != s2" << endl;
  }
  s1->contents = 100;
  printf("s1->contents = %d\n",s1->contents);
  //销毁一次,因为只有一个实例
  delete s1;

  //2.一般构造
  SingleTest *s3 = new SingleTest();
  s3->contents = 200;
  printf("s3->contents = %d\n",s3->contents);
  delete s3;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openGauss 年度大型开发者会议来袭,快来看看都有哪些SIG组参加!

openGauss Developer Day 2023 将于5月26日在北京举办。作为大会的重要环节&#xff0c; SIG组版本规划工作会议 将汇聚社区各个SIG 组的用户与开发者&#xff0c;与大家见面&#xff0c;共同讨论开源数据库的技术发展与创新。属于开发者的狂欢日&#xff0c;期待大家的到…

CMAKE命令详解

目录 CMake 语法 案例&#xff1a; 面试中给可能会问的问题和回答&#xff1a; 总结&#xff1a; CMake 是一个用于构建和管理跨平台软件项目的开源工具。它使用名为 CMakeLists.txt 的文本文件来描述项目的构建过程。 CMake 语法 当使用 CMake 构建项目时&#xff0c;可以…

数据库索引结构(1)概念

常见的索引 主键和二级索引 MySQL学习笔记-主键索引和二级索引_mysql中主键索引和二级索引的区别_爱因诗贤的博客-CSDN博客 MYSQL-主键索引与二级索引_mysql二级索引存在哪个文件_青苔小榭的博客-CSDN博客 采用主键索引的好处&#xff1a;如果元素的位置发生修改&#xff0c;那…

华为OD机试真题 Java 实现【组合出合法最小数】【2023Q1 200分】

一、题目描述 给一个数组&#xff0c;数组里面都是代表非负整数的字符串&#xff0c;将数组里所有的数值排列组合拼接起来组成一个数字&#xff0c;输出拼接成的最小的数字。 二、输入描述 一个数组&#xff0c;数组不为空&#xff0c;数组里面都是代表非负整数的字符串&…

解读智慧城市建设的关键角色:GIS技术的应用与优势

近年来&#xff0c;随着城市化进程的加快和信息技术的迅猛发展&#xff0c;智慧城市成为了城市发展的重要方向。而在智慧城市建设中&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术的应用正发挥着越来越重要的作用。GIS技术以其独特的地理空间分析能力&#xff0c;为…

龙芯2K1000实战开发-项目整体框架介绍

文章目录 概要整体架构技术名词解释技术细节小结概要 本项目主要以龙芯2k1000为CPU实现整个系统的管理,主要实现数据交换、时间同步和数据监控等功能。项目中龙芯作为一部分存在,考虑到项目涉密的原因,不能将整个项目的应用背景及项目整体方案做介绍,只能将龙芯过程开发做一…

NSSCTF之Web篇刷题记录(12)

NSSCTF之Web篇刷题记录[12] [NCTF 2018]签到题&#xff1a;[鹤城杯 2021]EasyP&#xff1a;[NSSCTF 2022 Spring Recruit]ezgame:[GXYCTF 2019]Ping Ping Ping&#xff1a;[SWPUCTF 2021 新生赛]finalrce&#xff1a;[NISACTF 2022]checkin&#xff1a; NSSCTF平台&#xff1a;…

程序员成长之路有哪些绝对不能踩的坑?

文章目录 一、你在编写代码时&#xff0c;会特别注意哪些流程&#xff1f;二、你在工作过程中踩过哪些坑&#xff1f;你是如何处理的呢&#xff1f;三、结合自身工作经验&#xff0c;分享一下程序员有哪些要避免的坑吧。总结 程序员编写高质量、可维护、安全且高效的代码&#…

【Python文本处理】基于运动路线记录GPX文件解析,心率、速度、时间、功率、踏频、海拔等参数的生成和更改

【Python文本处理】基于运动路线记录GPX文件解析&#xff0c;心率、速度、时间、功率、踏频、海拔等参数的生成和更改 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;time 心率&#xff1a;heartrate 功…

推荐5个非常强大的ChatGPT浏览器插件|你的生产力提高工具

近期&#xff0c;ChatGPT变得越来越热门&#xff0c;为此&#xff0c;许多浏览器插件也随之问世。这些基于ChatGPT的浏览器插件大大提高了ChatGPT的能力&#xff0c;使得我们能够更高效地在平时的上网、工作和学习中获得帮助&#xff0c;从而节省了大量时间。 今天我来给大家介…

168天,从外包转岗到阿里测开岗.....

本人毕业于某普通二本院校非计算机专业&#xff0c;跨专业入行测试&#xff0c;至今有近 5年工作经验。 第一份测试工作是在腾讯做了两年外包。总体感受就是 这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c; 接触不到核心技术&#xf…

分享以MM32SPIN0280单片机为主控洗衣机方案

洗衣机是利用电能产生机械作用来洗涤衣物的清洁电器&#xff0c;按驱动方法有3类&#xff0c;直接驱动&#xff0c;皮带驱动&#xff0c;波轮式驱动。 主变一体洗衣机方案以MM32SPIN0280为主控 MCU规格&#xff1a; -ArmCortex-M0内核&#xff0c;最高工作频率可达96MHz -128…

软件测试面试至今0 offer的小伙伴,问题到底出在哪儿?

转眼已是五月中旬&#xff0c;求职招聘季也快要结束啦&#xff0c;如果没点真技术 真本事&#xff0c;不了解点职场套路&#xff0c;在今年行情下&#xff0c;找工作可是难上加难。 现在点开微博或者脉脉&#xff0c;只要搜索“招聘”&#xff0c;用“惨不忍睹”来形容也不为过…

《计算机组成原理》期末复习一文总结

文章目录 第1讲&#xff1a;概论一、课程内容课程简介课程教材慕课堂二、课程组成结构计算机系统组成计算机软硬件概念以运算器为中心现代计算机的存储器为中心 硬件各部分关系内存基本组成运算器基本组成累加器&#xff08;相当于寄存器&#xff09; 控制器组成 第2讲&#xf…

[VRTK4.0]设置OpenXRCameraRig

学习目标&#xff1a; 演示如何设置Unity项目以支持OpenXR&#xff0c;以及如何安装VRTK v4TiliaUnitvXRFrameWork用于OpenXR的CameraRig。还展示了如何设置Tilia TrackedAlias预制件可轻松访问底层CameraRig功能。 流程&#xff1a; 步骤一&#xff1a; 我们现在要将我…

【数项级数】敛散性判别

阅读本篇之前&#xff0c;建议可以先看一下上一篇文章哦&#xff01; 【数项级数】无穷个数相加一定是个数吗&#xff1f; 柯西收敛准则判断级数敛散性 基本思想利用柯西收敛准则判断级数是否收敛推论&#xff1a;定理 基本思想 在上一篇文章中&#xff0c;初识数项级数&#…

如果要走网络安全这方面,需要考哪些证呢?

网络工程师VS网络安全工程师&#xff0c;哪个能带你走上人生巅峰&#xff1f; 众所周知&#xff0c;网络安全是以技术为核心的行业&#xff0c;年薪的多少是和技术挂钩的&#xff0c;但是很多没有工作经验的或者想转行到网安的大学生想要找到一份好工作&#xff0c;一个含金量…

Unity 灯光组件Light

灯光简介 在 Hierarchy 窗口右键&#xff0c;选择 Light&#xff0c;再选择具体的灯光类型&#xff0c;在 Inspector 窗口查看灯光组件如下&#xff1a; Type&#xff1a;灯光类型&#xff0c;主要有&#xff1a;Directional&#xff08;平行光&#xff09;、Spot&#xff08;聚…

【OpenStack】初识

云计算中的操作系统&#xff0c;负责计算能力 三大核心组件&#xff1a;子项目nova负责计算能力、neutron(Quantum):Networking网络、Swift&#xff1a;Storage 存储 共享服务&#xff1a;认证服务、数据库服务等 api、dashboard浏览器界面 主要组件&#xff1a; 1. 2. OpenSt…

uniapp在H5获取当前定位信息不需要SDK可直接获取城市(包括经纬度省市区和市区编码)

前言 最近在做获取用户当前定位信息的时候&#xff0c;发现uniapp官方提供的uni.getLocation(OBJECT)兼容性并不是特别好&#xff0c;光注意事项都是密密麻麻一大堆&#xff0c;在实际使用场景下&#xff0c;效果并不理想&#xff0c;也不是很稳定。于是便重新封装了一下腾讯地…