62 - 单例类模板

news/2024/5/19 2:49:38/文章来源:https://blog.csdn.net/weixin_36098975/article/details/128110640

---- 整理自狄泰软件唐佐林老师课程

1. 单例模式

1.1 需求的提出

在架构设计时,某些类 在整个系统生命期中 最多只能有一个对象存在Single Instance

1.1.1 问题

如何定义一个类,使得这个类最多只能创建一个对象?

1.1.2 思路

  • 要控制类的对象数目,必须 对外隐藏 构造函数
    • 将构造函数的访问属性设置为private
    • 定义instance并初始化为NULL
    • 当需要使用对象时,访问instance的值
      • 空值:创建对象,并用instance标记
      • 非空值:返回instance标记的对象

1.2 编程实验:单例模式初探

#include <iostream>
#include <string>using namespace std;class SObject
{static SObject* c_instance;// 将构造函数,拷贝构造函数,赋值函数全部私有化,外部无法创建对象SObject(const SObject&);SObject& operator= (const SObject&);SObject(){}
public:static SObject* GetInstance();void print(){cout << "this = " << this << endl;}
};SObject* SObject::c_instance = NULL;SObject* SObject::GetInstance()
{if( c_instance == NULL ){c_instance = new SObject();}return c_instance;
}int main()
{SObject* s = SObject::GetInstance();SObject* s1 = SObject::GetInstance();SObject* s2 = SObject::GetInstance();s->print();s1->print();s2->print();return 0;
}

在这里插入图片描述

1.3 存在的问题

需要使用单例模式时:

  • 必须定义静态成员变量 c_instance
  • 必须定义静态成员函数 GetInstance()

1.4 解决方案

将单例模式相关的代码抽取出来,开发单例类模板。
当需要单例类时,直接使用单例类模板。

1.5 编程实验:单例类模板

#ifndef _SINGLETON_H_
#define _SINGLETON_H_template
<typename T>
class Singleton {static T* c_instance;
public:static T* GetInstance();
};template
<typename T>
T* Singleton<T>::c_instance = NULL;template
<typename T>
T* Singleton<T>::GetInstance() {if (c_instance == NULL) {c_instance = new T();}return c_instance;
}#endif

在这里插入图片描述

2. 小结

  • 单例模式是开发中最常用的设计模式之一
  • 单例模式的应用使得一个类最多只有一个对象
  • 可以将单例模式相关的代码抽象成类模板
  • 需要使用单例模式的类直接使用单例模板

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟电路设计(35)---几种脉宽调制型开关电路

Forward单端正激变换器 在buck变换器开关与负载之间插入隔离变压器&#xff0c;这种隔离型buck变换器叫做Forward单端正激变换器。如下图所示&#xff1a; Forward单端正激变换器 简单分析可知&#xff0c;滤波电感L在开关管关断期间&#xff0c;通过续流二极管为负载提供电流…

【手把手】教你玩转SpringCloud Alibaba之Nacos Config深入

1、不同环境相同配置问题-自定义Data ID配置 在实际的开发过程中&#xff0c;项目所用到的配置参数有的时候并不需要根据不同的环境进行区分&#xff0c;生产、测试、开发环境所用到的参数值是相同的。怎么解决同一服务在多环境中&#xff0c;引用相同的配置的问题&#xff1f…

Flutter 离线数据方案 Flutter_Data 包

Flutter 离线数据方案 Flutter_Data 包 原文 https://levelup.gitconnected.com/flutter-offline-first-with-flutter-data-62bad61097be 前言 通过离线优先来改善您的用户体验 Flutter Data 是一个让你的应用程序先离线的软件包。 离线时&#xff0c;它在设备上使用 Hive 存储…

H2N-Hyp-FF-OH, 2493080-84-3

Hyp-Phe-Phe 是一种三肽&#xff0c;通过 Phe 环的芳香相互作用形成螺旋状的薄片&#xff0c;构成一个交叉螺旋结构。Hyp-Phe-Phe 具有很高的剪切压电特性&#xff0c;可作为一种压电材料。Hyp-Phe-Phe is a tripeptide that forms helical-like sheets via aromatic interacti…

天翎知识文档系统+群晖NAS,助力企业实现移动化学习

编者按&#xff1a;移动化学习成为一种社会发展趋势&#xff0c;本文分析了企业移动化学习的意义&#xff0c;并提出了企业移动化学习的一款全新解决方案——天翎知识文档系统群晖NAS。 关键词&#xff1a;多端适配&#xff0c;学习培训&#xff0c;智能问答&#xff0c;在线预…

计算机内存与外存的区别及使用配合(内存外存区别与搭配;快速缓存;计算机总线结构)

计算机系统结构1. 为什么计算机存储会分为内存和外存呢&#xff1f;2. 关于快速缓存3. 计算机总线结构1. 为什么计算机存储会分为内存和外存呢&#xff1f; 外部储存器断电可以存储数据&#xff0c;但是读写速度相对于cpu来说很慢&#xff0c;而内存虽然读取速度很快但是断电之…

微服务框架 SpringCloud微服务架构 6 Nacos 配置管理 6.1 Nacos 实现配置管理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构6 Nacos 配置管理6.1 Nacos 实现配置管理6.1.1 统一配置管理6.1.2 直接开干…

SpringBoot中如何实现业务校验,这种方式才叫优雅!

大家好&#xff0c;在日常的接口开发中&#xff0c;为了保证接口的稳定安全&#xff0c;我们一般需要在接口逻辑中处理两种校验&#xff1a; 参数校验 业务规则校验 首先我们先看看参数校验。 参数校验 参数校验很好理解&#xff0c;比如登录的时候需要校验用户名密码是否为…

路径规划算法之刚体变换

目录 1 一般概念 1.1 基元的变换 1.2 一个参数化的变换族 2 2D变换 2.1 translation 2.2 rotation 2.3 Combining translation and rotation 3 3D变换 3.1 Yaw, pitch, and roll rotations 3.2 Determining yaw, pitch, and roll from a rotation matrix 3.3 The ho…

PyQt5 窗口数据传递

PyQt5 窗口数据传递单一窗口数据传递多窗口数据传递&#xff1a;调用属性多窗口数据传递&#xff1a;信号与槽开发应用程序时&#xff0c;若只有一个窗口则只需关心这个窗口里面的各控件之间如何传递数据。如果程序有多个窗口&#xff0c;就要关心不同的窗口之间是如何传递数据…

windows10系统安装nvm切换电脑node版本

介绍 nvm 是 node version manager&#xff08;node 版本管理工具&#xff09;的缩写&#xff0c;是一个命令行工具&#xff0c;用于管理和切换到不同版本的 node.js。 不同的项目可能需要不同版本的 node.js 和 npm&#xff08;node 包管理器&#xff09;&#xff0c;例如&a…

CentOS7安装superset2.0

备注&#xff1a;自己在CentOS7.5下安装superset2.0成功。数据库以本地sqlite为准。Superset是由Python语言编写的Web应用&#xff0c;Superset2.0版本要求Python3.9的环境。 1、安装Miniconda 原因&#xff1a;conda是一个开源的包、环境管理器&#xff0c;可以用于在同一个…

学习ASP.NET Core Blazor编程系列十三——路由(完)

九、NavigationManager 有的时候我们可能需要在代码里进行导航&#xff0c;如果是JavaScript我们会用window.location来切换页面&#xff0c;Blazor为我们提供了相应的封装&#xff1a;NavigationManager。使用NavigationManager可以通过代码直接进行页面间的跳转。我们在BookI…

ARM架构与编程 · 基于IMX6ULL

一、嵌入式系统硬件介绍 cpu RAM&#xff08;内存&#xff09; FALSH 集成&#xff08;flash存储设备&#xff09; MCU/单片机 AP/ MPU 进化之后可以外接内存和存储设备,跑复杂的操作系统&#xff0c;比如手机 cpu一上电就会执行程序&#xff0c;程序存放在片内的ROM中&…

STL 迭代器萃取

导言 什么是迭代器 迭代器是一种抽象的设计概念&#xff0c;《Design Patterns》一书中对于 iterator 模式的定义如下&#xff1a;提供一种方法&#xff0c;使之能够依序巡访某个聚合物&#xff08;容器&#xff09;所含的各个元素&#xff0c;而又无需暴露该聚合物的内部表述…

云计算模式的优势

PaaS是一种云计算形式&#xff0c;它提供了一个平台&#xff0c;允许开发人员和程序员开发、运行和管理自己的应用&#xff0c;而无需构建和维护相关的基础架构或平台。它就像是一个地基&#xff0c;由专门的平台服务提供商进行搭建和运营&#xff0c;并将该平台以服务的方式提…

因子模型:套利定价理论APT

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 因子模型(factor models)用来解释资产的风险或者回报的特点。在CAPM模型中&#xff0c;资产的回报几乎就是由市场决定的&#xff0c;每个资产对市场的敏感程度可以用beta来描述。因而&#xff0c;在C…

从 select、poll、epoll 回答IO多路复用

前言 先大概了解一下这方面的知识 IO多路复用指的是单个进程或者线程能同时监听处理多个IO请求&#xff0c; select、epoll、poll是LinuxAPI提供的复用方式。本质上是由操作系统内核缓存fd文件描述符&#xff0c; 使得单个进程线程能监视多个文件描述符。 select是将所有文件…

NumPy 数组应用初探

NumPy是Python中科学计算的基本包。它是一个Python库&#xff0c;提供了一个多维数组对象&#xff0c;各种派生对象&#xff08;如屏蔽数组和矩阵&#xff09;&#xff0c;以及对数组进行快速操作的各种例程&#xff0c;包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶…

SVN+Gitee配置版本控制库

软件 TortoiseSVN&#xff1a;Downloads TortoiseSVN Gitee&#xff1a;https://gitee.com/ 操作步骤 在Gitee中新建仓库&#xff0c;设置仓库名以及模板&#xff08;Readme文件&#xff09;&#xff1b; 启用SVN访问 在仓库的管理页面&#xff0c;选择“功能设置”中的“…