面向对象的设计模式

一、设计模式简介

1、什么是设计模式

针对反复出现的问题所总结归纳出的通用解决方设计模式是指在软件开发过程中案。这些方案是众多软件开发人员经过大量实践总结出来的,具有高效性、可维护性和可扩展性等优点。使用设计模式可以帮助开发者更高效地构建软件系统,提高代码的复用性、可维护性和可扩展性,同时也能降低系统的耦合度。

2、设计模式分类

大体上设计模式分为3中类型:创建型、结构型和代码型

23种设计模式

二、单例设计模式

其特点是只提供唯一一个类的设计模式,具有全局变量的特点,在任何位置都可以通过接口获取到唯一实例。他的优点显而易见:

他能够避免对象重复创建,节约空间并提升效率

避免由于操作不同实例导致的逻辑错误

单例模式有两种实现模式:饿汉式和懒汉式

饿汉:饿了肯定要饥不择⻝。所以在单例类定义的时候就进⾏实例化。

懒汉:在第⼀次⽤到类实例的时候才会去实例化。什么时候使⽤,什么时候创建单例

#include <iostream>
#include <string>
#include<memory>using namespace std;
//单例的 饿汉模式的实现--特点:在定义类的时候就创建了一个对象
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){return instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=new Singleton;int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750

#include <iostream>
#include <string>
#include<memory>using namespace std;
//单例的 懒汉模式的实现--特点:第一次用类的实例才创建对象
//对于多线程环境下 饿汉模式它是线程安全的,对于懒汉模式在多线程下是不全的。
class Singleton
{public://Singleton(const Singleton&temp )=delete;static Singleton*get_instance(){if(instance==nullptr){instance=new Singleton;}return  instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;};Singleton*Singleton::instance=nullptr;int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750
#include <iostream>
#include <string>
#include<memory>
#include<mutex>using namespace std;
//单例的 懒汉模式的实现--特点:第一次用类的实例才创建对象
//对于多线程环境下需要加锁实现实例的唯一性, 对于懒汉模式在多线程下是不安全的。
class Singleton
{public:static Singleton*get_instance(){if(instance==nullptr){lock.lock();if(instance==nullptr){instance=new Singleton;}lock.unlock();}return  instance;}void test(){cout << "测试"<<this << endl;}private:Singleton()=default;//Singleton(const Singleton&temp )=default;	Singleton(const Singleton&temp )=default;Singleton& operator=(const Singleton&temp)=default;static Singleton*instance;static mutex lock;};Singleton*Singleton::instance=nullptr;
mutex Singleton::lock;//通过该类的默认构造函数来进行初始化,默认初始化为不上锁状态int main()
{Singleton *obj1=	Singleton::get_instance();Singleton *obj2=	Singleton::get_instance();obj1->test();obj2->test();return 0;
}
//测试0x1fb01e91750
//测试0x1fb01e91750

基础要点: 全局只有⼀个实例:static 特性,同时禁⽌⽤户⾃⼰声明并定义实例(把构造 函数设为 private) 线程安全 禁⽌赋值和拷⻉ ⽤户通过接⼝获取实例:使⽤ static 类成员函数

关于如何选择懒汉和饿汉模式:

懒汉:在访问量较⼩时,采⽤懒汉实现。这是以时间换空间。

饿汉:由于要进⾏线程同步,所以在访问量⽐较⼤,或者可能访问的线程⽐较 多时,采⽤饿汉实现,可以实现更好的性能。这是以空间换时间。

加了锁,使⽤互斥量来达到线程安全。这⾥使⽤了两个 if 判断语句的技术称为 双检锁;好处是,只有判断指针为空的时候才加锁,避免每次调⽤ getInstance 的⽅法都加锁,锁的开销毕竟还是有点⼤的。

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

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

相关文章

每日钉钉API探索:chooseDepartments专注于部门维度的选择接口

在企业级应用开发过程中&#xff0c;针对组织架构中的部门进行操作是非常常见的需求。今天我们要介绍的是钉钉的chooseDepartments API&#xff0c;它允许用户以部门为单位进行选择&#xff0c;并返回所选部门的相关信息。&#x1f4cc; 功能概述chooseDepartments API主要用于…

生产环境CI/CD流水线构建与优化实践指南

生产环境CI/CD流水线构建与优化实践指南 目录 业务场景描述技术选型过程实现方案详解 流水线结构设计并行构建与缓存策略部署策略&#xff1a;滚动、蓝绿、金丝雀回滚与告警自动化 踩过的坑与解决方案总结与最佳实践 业务场景描述 某大型电商平台&#xff0c;为了保证代码持续交…

腾讯云和火山云优劣势对比

从问题本身看&#xff0c;用户没有限定具体场景&#xff0c;说明可能需要一个全面的横向对比。不过云计算服务涉及面太广&#xff0c;我最好先搭建一个框架性的分析结构&#xff0c;再填充具体细节。 首先想到从几个核心维度切入&#xff1a;基础能力&#xff08;计算存储网络&…

Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南

Augment AI 0.502.0版本深度解析&#xff1a;Task、Guidelines、Memory三大核心功能实战指南 augment最新版辅助功能全解析续杯免费额度再用满教程|memory|userguidlines|tasksaugment最新插件功能教程前言 在AI辅助编程领域&#xff0c;Augment AI作为一款强大的VS Code插件&…

docker搭建、小皮面板搭建、bp使用、msf

docker搭建Vulhub靶场 docker安装 apt-get install docker.io docker-compose#设置docker代理&#xff1a;创建文件夹以及对应的文件 mkdir /etc/systemd/system/docker.service.d#在该文件中配置自己的代理ip以及代理端口 vim /etc/systemd/system/docker.service.d/http-p…

AI优化器美国VPS集成:智能算力部署与性能调优指南

在当今数字化浪潮中&#xff0c;AI优化器与高性能VPS的融合正成为企业技术架构的核心竞争力。本文将深入解析美国VPS服务器如何通过AI驱动的智能优化技术实现算力突破&#xff0c;从资源配置算法到实时流量调度&#xff0c;全面揭示这种创新组合在跨境电商、大数据分析等场景中…

【保姆级图文详解】Spring AI 中的工具调用原理解析,工具开发:文件操作、联网搜索、网页抓取、资源下载、PDF生成、工具集中注册

目录前言一、Spring AI 中的工具调用&#xff08;Tool Calling&#xff09;1.1、概念1.2、工作原理1.3、技术选型1.4、原理解析1.4.1、实现接口1.4.2、工具调用二、工具调用&#xff08;Tool Calling&#xff09;开发2.1、文件操作2.1.1、概念描述2.1.2、概念描述2.2、联网搜索…

Redis客户端使用(Client、Java、SpringBoot)

上篇文章&#xff1a; Redis数据类型之zsethttps://blog.csdn.net/sniper_fandc/article/details/149139955?fromshareblogdetail&sharetypeblogdetail&sharerId149139955&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Redis客户端…

Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(一

引言 ** 在工业自动化领域&#xff0c;Modbus 协议犹如一座桥梁&#xff0c;连接着各种电子设备&#xff0c;实现它们之间高效的数据交互。从可编程逻辑控制器&#xff08;PLC&#xff09;到人机界面&#xff08;HMI&#xff09;&#xff0c;再到各类智能传感器&#xff0c;M…

Oracle SQL - 使用行转列PIVOT减少表重复扫描(实例)

[13/JUL/2025, Yusuf Leo, Oracle SQL Performance Tuning Series]我们经常会遇到从同一表中按不同维度取出不同区间的数据&#xff0c;再以相同的属性将这些数据分别汇总到一起的需求。这类需求往往迫使我们对同一个表反复去扫描&#xff0c;当原始数据量太大的时候&#xff0…

HTTP 请求方法详解:GET、POST、PUT、DELETE 等

在 HTTP 协议中&#xff0c;请求方法&#xff08;也称为 HTTP 动词&#xff09;定义了客户端希望对指定资源执行的操作类型。这些方法是 HTTP 报文的核心组成部分&#xff0c;决定了请求的目的和行为。 主要 HTTP 请求方法 1. GET 用途&#xff1a;获取资源 特点&#xff1a…

Android 代码热度统计(概述)

1. 前言 代码热度统计&#xff0c;在测试中一般也叫做代码覆盖率。一般得到代码覆盖率后就能了解整体样本在线上的代码使用情况&#xff0c;为无用代码下线提供依据。 做了一下调研&#xff0c;在Android中一般比较常用的是&#xff1a;JaCoCO覆盖率统计工具&#xff0c;它采…

RAG优化

RAG搭建本地AI知识库&#xff0c;在使用过程中遇到的三大痛点&#xff0c;以及相应的进阶方案。1. RAG知识库的三大痛点-- 内容理解不足&#xff1a;AI难以全面理解导入资料的内容&#xff0c;比如在向量编码时候&#xff0c;生硬的截断等导致分析结果不理想。eg: 知识库分割器…

Ubuntu 24.04 启用 root 图形登录

关键词&#xff1a;Ubuntu 24.04、root 登录、GDM、SSH、nano、配置文件一、前言 Ubuntu 默认禁用 root 账户 的图形与 SSH 登录&#xff0c;这是为了安全。但在某些场景&#xff08;如测试、救援、自动化脚本&#xff09;你可能需要 直接用 root 登录 GNOME 桌面。本文以 Ubun…

Jekyll + Chirpy + GitHub Pages 搭建博客

Chirpy 是适用于技术写作的简约、响应迅速且功能丰富的 Jekyll 主题&#xff0c;文档地址&#xff1a;https://chirpy.cotes.page/ &#xff0c;Github 地址&#xff1a;jekyll-theme-chirpy 。 1.开始 打开 chirpy-starter 仓库&#xff0c;点击按钮 Use this template -->…

学习 Flutter (一)

学习 Flutter (一) 1. 引言 什么是 Flutter&#xff1f; Flutter 是 Google 开发的一套开源 UI 框架&#xff0c;主要用于构建高性能、高保真、跨平台的应用程序。使用一套 Dart 编写的代码&#xff0c;开发者可以同时构建适用于&#xff1a; Android iOS Web Windows、mac…

Spring Boot 实现图片防盗链:Referer 校验与 Token 签名校验完整指南

Spring Boot 实现图片防盗链教程&#xff08;Referer 校验 Token 签名校验&#xff09;本文将详细讲解两种防盗链实现方案&#xff0c;并提供完整代码示例。方案一&#xff1a;Referer 校验通过检查 HTTP 请求头中的 Referer 字段判断来源是否合法。实现步骤创建 Referer 拦截…

从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅

目录 一、为什么要谈 JSON 二、最快速上手&#xff1a;两把钥匙 dumps 与 loads 三、深入 dumps&#xff1a;参数是魔法棒 四、深入 loads&#xff1a;把风险挡在门外 五、文件级序列化&#xff1a;dump 与 load 六、处理中文与编码陷阱 七、异常场景与调试技巧 八、实…

Leetcode 3315. 构造最小位运算数组 II

1.题目基本信息 1.1.题目描述 给你一个长度为 n 的质数数组 nums 。你的任务是返回一个长度为 n 的数组 ans &#xff0c;对于每个下标 i &#xff0c;以下 条件 均成立&#xff1a; ans[i] OR (ans[i] 1) nums[i] 除此以外&#xff0c;你需要 最小化 结果数组里每一个 a…

黑搜小知识 | DNS域名解析过程是什么样的?

什么是DNS&#xff1f;DNS( Domain Name System)是“域名系统”的英文缩写&#xff0c;是一种组织成域层次结构的计算机和网络服务命名系统&#xff0c;它用于TCP/IP网络&#xff0c;它所提供的服务是用来将主机名和域名转换为IP地址的工作。举例来说&#xff0c;如果你要访问域…