当前位置: 首页 > news >正文

设计模式六大原则和单例模式

设计模式

目的

实现可重用解决方案,构筑易维护、可扩展的软件系统。

六大原则

单一职责: 类的职责单一,一个方法做一件事。

开闭原则: 拓展开放,修改关闭。

里氏替换: 父类能出现的地方,子类可以替换。子类必须全部实现父类方法,尽量不暴露自己public方法供外界使用。覆盖或实现父类方法时,输入参数可以多。

依赖倒置: 模块之间的依赖通过抽象发生,具体类之间不依赖。每个类尽量有抽象类,任何类不应该从具体类派生,尽量不重写基类方法。

迪米特法则: 尽量减少对象间交互,从而减少类间耦合。

接口隔离原则: 类间的依赖关系建立在最小的接口上。

抽象构建框架,实现拓展细节。

单例模式

一个类只有一个对象,及系统中只有一个实例,实例被所有程序模块共享。

例如服务器配置信息放在一个文件中,配置数据由单例对象统一读取,服务进程的其他对象通过单例对象获取配置信息。

实现

有饿汉模式和懒汉模式两种实现模式。

饿汉模式

程序启动就创建唯一实例对象。

多线程获取单例对象不需要加锁。

#include <iostream>
#include <string>class Singleton {
private:// 私有构造函数,防止外部创建实例Singleton() : data("Singleton") {std::cout << "Singleton instance created!" << std::endl;}// 私有析构函数,防止外部删除实例~Singleton() {}// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态成员变量,类加载时初始化static Singleton instance;// 成员变量std::string data;public:// 获取单例对象的静态方法static Singleton& getInstance() {return instance;}// 获取成员变量的方法std::string& getData() {return data;}
};// 在类外初始化静态成员变量
Singleton Singleton::instance;int main() {// 获取单例对象Singleton& singleton = Singleton::getInstance();// 访问单例对象的成员变量std::cout << "Data: " << singleton.getData() << std::endl;// 再次获取单例对象,验证是否为同一个实例Singleton& singleton2 = Singleton::getInstance();if (&singleton == &singleton2) {std::cout << "Both references point to the same instance!" << std::endl;}return 0;
}

懒汉模式

如果单例对象构造特别耗时或者耗资(加载插件、网络),可在第一次使用时才创建对象。

C++11 之后,局部静态变量的初始化是线程安全的,因此可以直接使用局部静态变量实现懒汉模式

#include <iostream>
#include <string>class Singleton {
private:// 私有构造函数,防止外部创建实例Singleton() : data("Singleton") {std::cout << "Singleton instance created!" << std::endl;}// 私有析构函数,防止外部删除实例~Singleton() {}// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 成员变量std::string data;public:// 获取单例对象的静态方法static Singleton& getInstance() {static Singleton instance;  // 局部静态变量,线程安全return instance;}// 获取成员变量的方法std::string& getData() {return data;}
};int main() {// 获取单例对象Singleton& singleton = Singleton::getInstance();// 访问单例对象的成员变量std::cout << "Data: " << singleton.getData() << std::endl;// 再次获取单例对象,验证是否为同一个实例Singleton& singleton2 = Singleton::getInstance();if (&singleton == &singleton2) {std::cout << "Both references point to the same instance!" << std::endl;}return 0;
}

推荐一下

https://github.com/0voice

相关文章:

设计模式六大原则和单例模式

设计模式 目的 实现可重用解决方案&#xff0c;构筑易维护、可扩展的软件系统。 六大原则 单一职责&#xff1a; 类的职责单一&#xff0c;一个方法做一件事。 开闭原则&#xff1a; 拓展开放&#xff0c;修改关闭。 里氏替换&#xff1a; 父类能出现的地方&#xff0c;子…...

Redis性能优化

1.是否使用复杂度过高的命令 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢…...

SAM 大模型杂谈

目录 1. 前言 2. 发展历程 3. SAM 大模型的技术架构 3.1 模型结构 3.2 训练方法 3.3 数据处理 4. SAM 大模型的应用领域 4.1 自然语言处理 4.2 计算机视觉 4.3 多模态学习 4.4 其他领域 5. SAM 大模型的优势与挑战 5.1 优势 5.2 挑战 6. SAM 大模型的未来发展方…...

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…...

B站自研的第二代视频连麦系统(上)

导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面&#xff0c;介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解&#xff0c;帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中&#xff…...

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是&#xff1a;支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…...

基于HAI部署DeepSeekR1的招标文书智能辅助生产开发与应用

一、前言 1.1行业背景 在日常商业活动中&#xff0c;招投标流程往往是企业竞标和项目落地的关键一环。其中&#xff0c;招标文书的编写工作对于投标企业极具挑战&#xff1a;既要保证逻辑清晰、条理分明&#xff0c;又必须遵循招标机构的各类格式规范&#xff0c;甚至还有特定…...

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…...

模拟实战-用CompletableFuture优化远程RPC调用

实战场景 这是广州某500-900人互联网厂的面试原题 手写并发优化解决思路 我们要调用对方的RPC接口&#xff0c;我们的RPC接口每调用一次对方都会阻塞50ms 但是我们的业务要批量调用RPC&#xff0c;例如我们要批量调用1k次&#xff0c;我们不可能在for循环里面写1k次远程调用…...

深入解析:Jsoup 库的多功能应用场景

Jsoup 是一个强大的 Java 库&#xff0c;主要用于解析和操作 HTML 文档。它不仅广泛应用于网络爬虫和数据抓取&#xff0c;还在网页内容分析、数据清洗与处理、自动化测试等多个领域有着广泛的应用。本文将详细介绍 Jsoup 库的多种用途&#xff0c;并提供具体的代码示例。 一、…...

Polardb三节点集群部署安装--附虚拟机

1. 架构 PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计&#xff0c;系统由4个核心组件组成。 计算节点&#xff08;CN, Compute Node&#xff09; 计算节点是系统的入口&#xff0c;采用无状态设计&#xff0c;包括 SQL 解析器、优化器、执行器等模块。负责数据…...

Redis - 全局ID生成器 RedisIdWorker

文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中&#xff0c;生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...

【Vitest】单元测试

文章目录 测试&#xff1a;Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试&#xff1a;Vitest 一、安装 npm install vitest创建文件&#xff1a;example.test.ts 运行测试&#xff1a; npx vitest example二、断言 import { expect, test } from vi…...

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明基于脱机备份方式的单实例转主备流程图详细步骤说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建…...

【Elasticsearch】nested聚合

在 Elasticsearch 中&#xff0c;嵌套聚合&#xff08;nestedaggregation&#xff09;的语法形式用于对嵌套字段&#xff08;nestedfields&#xff09;进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型&#xff0c;用于存储数组中的对象&#xff0c;这些对象需要独…...

虹科波形小课堂 | 三分钟掌握车辆相对压缩测试!不拆发动机、不测缸压就能判断故障缸!

不拆发动机、不测缸压&#xff0c;只测个电流也能知道哪个缸压缩有问题&#xff1f;没错&#xff01;做个相对压缩测试&#xff0c;测下起动电流就行&#xff0c;简单又实用&#xff01;今天&#xff0c;从原理到方法&#xff0c;几分钟教会你&#xff01; 我们都知道&#xf…...

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…...

基于 Spring Cloud + Spring AI + VUE 的知识助理平台介绍以及问题

前言&#xff08;一些废话&#xff09; 在看这篇文章的各位大佬&#xff0c;感谢你们留出几分钟时间&#xff0c;来看这个产品介绍&#xff0c;其实重点说实话&#xff0c;不是这个产品怎么样。而是在最后有一个郁结在心里的几个问题&#xff0c;希望大佬们能给出一些建议。万…...

< 自用文儿 > 下载 MaxMind GeoIP Databases 对攻击的 IP 做 地理分析

起因 两个 VPM/VPS&#xff0c;安装了 fail2ban 去拦截密码穷举攻击。每天的记录都在增长&#xff0c;以前复制屏幕输出就行&#xff0c;一屏的内容还容易粘贴出来的。昨天已经过 500 条&#xff0c;好奇 fail2ban 是如何存储这些内容的&#xff1f;就发现它在使用 SQLite3 数…...

前端知识速记:重绘和回流

前端知识速记&#xff1a;重绘和回流 一、什么是重绘与回流 1. 重绘&#xff08;Repaint&#xff09; 重绘是指当元素的外观发生变化时&#xff0c;浏览器需要重新绘制这些元素。由于这些操作不会改变元素占据的空间&#xff0c;因此不需要进行回流。常见的重绘操作包括&…...

学习数字孪生,为你的职业发展开辟新赛道

你有没有想过&#xff0c;未来十年哪些技能最吃香&#xff1f; AI、大数据、智能制造、元宇宙……这些词频繁出现在招聘市场和行业报告中。而在它们背后&#xff0c;隐藏着一个“看不见但无处不在”的关键技术——数字孪生&#xff08;Digital Twin&#xff09;。 它不仅在制造…...

Gin框架实战指南:从入门到进阶

Gin框架实战指南&#xff1a;从入门到进阶 在当今的后端开发领域&#xff0c;Gin框架以其高性能、简洁易用的特点&#xff0c;赢得了众多Go语言开发者的青睐。本文将带你深入探索Gin框架的方方面面&#xff0c;从基础的安装与使用&#xff0c;到响应处理、请求参数解析、中间件…...

Python训练营打卡 Day46

道注意力(SE注意力) 知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后…...

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址

本文介绍了基于W5500芯片的ARP协议实现方法&#xff0c;详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射&#xff0c;确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现&#xff0c;包括网络初始化、SP…...

场景题-3

如何实现一个消息队列 拆解分析主流的几种消息队列 1、基本架构 生产者Producer、消费者Consumer、Broker&#xff1a;生产者发送消息&#xff0c;消费者接受消息&#xff0c;Broker是服务端&#xff0c;处理消息的存储、备份、删除和消费关系的维护。 主题和分区&#xff…...

护网行动面试试题(2)

文章目录 51、常见的安全工具有哪些&#xff1f;52、说说Nmap工具的使用&#xff1f;53、近几年HW常见漏洞有哪些&#xff1f;54、HW 三&#xff08;四&#xff09;大洞56、获得文件读取漏洞&#xff0c;通常会读哪些文件57、了解过反序列化漏洞吗&#xff1f;58、常见的框架漏…...

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)

CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 &#xff08;1&#xff09;EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs)&#xff0c;这些 IMFs 从高频到低频排列。 核心问题&#xff1a;模态混合 (Mode Mixing) 同…...

LLaMA-Factory的5种推理方式总结

LLaMA-Factory 作为一款开源的大语言模型微调与推理框架&#xff0c;提供了 5 种核心推理方式&#xff0c;覆盖从本地调试到生产部署的全流程需求。以下是具体方式及示例&#xff1a; 1. 交互式命令行推理 适用场景&#xff1a;快速测试模型效果或进行简单对话。 示例命令&am…...

Ubuntu中常用的网络命令指南

Ubuntu中常用的网络命令指南 在Ubuntu系统中&#xff0c;网络管理是日常运维和故障排查的核心技能。 &#x1f6e0;️ 基础网络诊断 ping - 测试网络连通性 ping google.com # 持续测试 ping -c 4 google.com # 发送4个包后停止traceroute / tracepath - 追踪数据包路径 …...

聊一聊 .NET在Linux下的IO多路复用select和epoll

一&#xff1a;背景 1. 讲故事 在windows平台上&#xff0c;相信很多人都知道.NET异步机制是借助了Windows自带的 IO完成端口 实现的异步交互&#xff0c;那在 Linux 下.NET 又是怎么玩的呢&#xff1f;主要还是传统的 select&#xff0c;poll&#xff0c;epoll 的IO多路复用…...