设计模式基础
设计模式可以分为三类:
- 创建型模式(Creational Patterns):关注对象的创建过程,以便于对象的实例化和组合,包括工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。
- 结构型模式(Structural Patterns):关注如何组合对象以形成更大的结构,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。
- 行为型模式(Behavioral Patterns):关注对象之间的通信和交互,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
学习设计模式的好处包括:
-
提高代码质量:设计模式是经过验证和优化的解决方案,能够帮助我们编写可读性更高、可维护性更好的代码。
-
提高开发效率:设计模式提供了一种标准化的解决方案,可以减少重复的代码编写工作,提高开发效率。
-
促进团队合作:设计模式提供了一种共同的语言和思维方式,能够促进团队之间的沟通和合作。
-
加强代码的可扩展性和可维护性:设计模式强调松耦合和可维护性,通过使用适当的设计模式可以使代码更易于扩展和修改。
-
提高代码的重用性:设计模式提供了一系列可复用的解决方案,可以帮助我们避免重复造轮子,提高代码的重用性。

设计模式的六大原则
设计模式的六大原则是:
- 单一职责原则(SRP,Single Responsibility Principle):一个类应该只有一个引起变化的原因,即一个类应该只有一个职责。这个原则强调了类的高内聚和低耦合。
- 开闭原则(OCP,Open-Closed Principle):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这个原则强调了通过扩展来实现变化,而不是通过修改原有代码来实现变化。
- 里氏替换原则(LSP,Liskov Substitution Principle):子类必须能够替换它们的基类,而不会影响程序的正确性。这个原则强调了子类必须保持基类的行为和约束。
- 依赖倒置原则(DIP,Dependency Inversion Principle):高层模块不应该依赖低层模块,它们应该依赖于抽象。这个原则强调了使用接口或抽象类作为依赖的类型,而不是具体的实现类。
- 接口隔离原则(ISP,Interface Segregation Principle):客户端不应该依赖它们不需要的接口。这个原则强调了将大接口拆分成多个小接口,以便只有需要的方法才能被客户端使用。
- 迪米特法则(LoD,Law of Demeter):一个对象应该对其他对象有尽可能少的了解,只与直接的朋友通信。这个原则强调了类之间的松耦合,减少对象之间的依赖关系。
单例模式
单例模式是一种设计模式,保证一个类只有一个实例,并提供全局访问点。
单例模式的特点包括:
- 一个类只有一个实例对象;
- 该实例对象由类内部创建,并对外提供访问方法;
- 该类只能被实例化一次;
- 提供对该实例的访问方法是静态方法。
单例模式常用于需要共享或控制资源访问的情况,例如数据库连接、线程池等。单例模式可以确保只有一个实例存在,从而避免资源的浪费和冲突。
实例
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点。
以下是一个简单的Java代码示例,实现了单例模式:
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造方法,防止外部实例化}public static Singleton getInstance() {if (instance == null) {// 当instance为空时,创建新的实例instance = new Singleton();}return instance;}
}
在上面的示例中,Singleton
类有一个私有的静态变量instance
,用于保存类的唯一实例。构造方法被声明为私有的,这意味着只能在类内部访问它,外部无法实例化该类。
getInstance
方法是一个公共的静态方法,用于获取Singleton
类的实例。在方法内部,首先检查instance
是否为null,如果为null,则创建一个新的实例并赋值给instance
变量,然后返回该实例。如果instance
已经存在,则直接返回它。
使用单例模式时,可以通过调用Singleton.getInstance()
来获取Singleton
类的实例:
Singleton singleton = Singleton.getInstance();
这样就确保了只有一个Singleton
实例存在,并且可以在程序的任何地方访问它。
总结
单例模式是一种创建型设计模式,它限制某个类只能创建一个实例,并提供全局访问的方式。单例模式的设计思想是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
单例模式的特点包括:
- 只有一个实例:单例模式确保只有一个唯一的实例存在。
- 全局访问点:单例模式提供一个全局访问点来获取该唯一实例。
单例模式的优点:
- 简化了对象的创建和访问:通过单例模式,我们可以简化对象的创建和访问过程,直接通过全局访问点获取该对象。
- 节省了系统资源:由于只有一个实例存在,可以节省系统资源的使用。
单例模式的缺点:
- 破坏了单一职责原则:由于单例模式的全局访问点,可能会导致该对象被多个模块访问和修改,从而破坏了单一职责原则。
- 可能引起线程安全问题:在多线程环境下,可能会引起线程安全问题,需要对单例对象进行进一步的处理来保证线程安全。
相关文章:

设计模式基础
什么是设计模式 设计模式是一种在软件设计过程中反复出现的问题和相应解决方案的描述。它是一种被广泛接受的经验总结,可以帮助开发人员解决常见的设计问题并提高代码的重用性、可维护性和可扩展性。 设计模式可以分为三类: 创建型模式(Crea…...

Glide支持通过url加载本地图标
序言 glide可以在load的时候传入一个资源id来加载本地图标,但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…...

网络安全形势与WAF技术分享
我一个朋友的网站,5月份时候被攻击了,然后他找我帮忙看看,我看他的网站、网上查资料,不看不知道,一看吓一跳,最近几年这网络安全形势真是不容乐观,在网上查了一下资料,1、中国信息通…...

【实战JVM】-实战篇-06-GC调优
文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…...

深入解析智慧互联网医院系统源码:医院小程序开发的架构到实现
本篇文章,小编将深入解析智慧互联网医院系统的源码,重点探讨医院小程序开发的架构和实现,旨在为相关开发人员提供指导和参考。 一、架构设计 智慧互联网医院系统的架构设计是整个开发过程的核心,直接影响到系统的性能、扩展性和维…...

获取 Bean 对象更加简单的方式
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。 对象装配(对象注⼊)即DI 实现依赖注入的方式有 3 种: 1. 属性注⼊ 2. 构造⽅法注⼊ 3. Setter 注⼊ 属性注入 属性注⼊是使⽤ Auto…...
ChatGPT基本原理
技术背景与基础: 深度学习:ChatGPT建立在深度学习技术之上,通过复杂的神经网络结构模拟人类的语言处理过程。深度学习使得ChatGPT能够处理海量的文本数据,并从中提取出复杂的语言模式和规律。GPT架构:ChatGPT基于GPT&a…...

几种更新 npm 项目依赖的实用方法
几种更新 npm 项目依赖的实用方法 引言1. 使用 npm update 命令2. 使用 npm-check-updates 工具3. 使用 npm outdated 命令4. 直接手动更新 package.json 文件5. 直接安装最新版本6. 使用自动化工具结语 引言 在软件开发的过程中,我们知道依赖管理是其中一个至关重…...

Python爬虫之简单学习BeautifulSoup库,学习获取的对象常用方法,实战豆瓣Top250
BeautifulSoup是一个非常流行的Python库,广泛应用于网络爬虫开发中,用于解析HTML和XML文档,以便于从中提取所需数据。它是进行网页内容抓取和数据挖掘的强大工具。 功能特性 易于使用: 提供简洁的API,使得即使是对网页结构不熟悉…...

前端怎么debugger排查线上问题
前端怎么debugger排查线上问题 1.问题背景2.问题详细说明3.处理方案a.开发环境怎么找,步骤一样的:b.生产环境怎么找,步骤一样的:还有一种情况就是你的子盒子是使用csshover父盒子出来的, 4.demo地址: 1.问题…...

LabVIEW源程序安全性保护综合方案
LabVIEW源程序安全性保护综合方案 一、硬件加密保护方案 选择和安装硬件设备 选择加密狗和TPM设备:选择Sentinel HASP加密狗和支持TPM(可信平台模块)的计算机主板。 安装驱动和开发工具:安装Sentinel HASP加密狗的驱动程序和开发…...
JS包装类:循环中为什么建议用变量存储str.length进行循环判断?
前言 在Javascript通常我们在遍历一个字符串的时候通常使用的方式是 var str "abcdefg"; for(let i0;i<str.length;i){}但在最近的学习中,有人建议我最好应该是下面这样执行。 var str "abcdefg"; for(let i0,len str.length;i<len;i)…...
Android Audio实战——音量默认值修改(一)
在前面的文章《音频配置加载》中我们知道了,Audio 的一些配置信息是由硬件驱动保存到 audio_policy_configuration.xml 文件中,音量的一些默认值也会如此。但是在一些车载设备开发中,需要适配不同车型的需求,一套代码通常要适配多个车型,这就需要在 FW 层进行一些默认值的…...

解决uni-app progress控件不显示问题
官方代码: <view class"progress-box"><progress :percent"80" show-info activeColor"red" stroke-width"10" /> </view> 进度条并不在页面中显示,那么我们需要给进度条加上宽高style"…...
使用C++版本的opencv dnn 部署onnx模型
使用OpenCV的DNN模块在C中部署ONNX模型涉及几个步骤,包括加载模型、预处理输入数据、进行推理以及处理输出。 构建了yolo类,方便调用 yolo.h 文件 #ifndef YOLO_H #define YOLO_H #include <fstream> #include <sstream> #include <io…...

python中实现队列功能
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是? from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…...

自然资源-关于城镇开发边界局部优化的政策思路梳理
自然资源-关于城镇开发边界局部优化的政策思路梳理 国土空间规划的核心之一是要统筹划定“三区三线”,三条控制线中的城镇开发边界的划定与优化工作,一直是国土空间规划改革的重要组成部分,其有助于遏制城市盲目扩张,强化底线约束…...

ElementUI的Table组件在无数据情况下让“暂无数据”文本居中显示
::v-deep .el-table__empty-block {width: 100%;min-width: 100%;max-width: 100%; }...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...