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

设计模式基础

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

设计模式可以分为三类:

  1. 创建型模式(Creational Patterns):关注对象的创建过程,以便于对象的实例化和组合,包括工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。
  2. 结构型模式(Structural Patterns):关注如何组合对象以形成更大的结构,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。
  3. 行为型模式(Behavioral Patterns):关注对象之间的通信和交互,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
为什么要学习设计模式
     

学习设计模式的好处包括:

  1. 提高代码质量:设计模式是经过验证和优化的解决方案,能够帮助我们编写可读性更高、可维护性更好的代码。

  2. 提高开发效率:设计模式提供了一种标准化的解决方案,可以减少重复的代码编写工作,提高开发效率。

  3. 促进团队合作:设计模式提供了一种共同的语言和思维方式,能够促进团队之间的沟通和合作。

  4. 加强代码的可扩展性和可维护性:设计模式强调松耦合和可维护性,通过使用适当的设计模式可以使代码更易于扩展和修改。

  5. 提高代码的重用性:设计模式提供了一系列可复用的解决方案,可以帮助我们避免重复造轮子,提高代码的重用性。

设计模式分类

设计模式的六大原则

    

设计模式的六大原则是:

  1. 单一职责原则(SRP,Single Responsibility Principle):一个类应该只有一个引起变化的原因,即一个类应该只有一个职责。这个原则强调了类的高内聚和低耦合。
  2. 开闭原则(OCP,Open-Closed Principle):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这个原则强调了通过扩展来实现变化,而不是通过修改原有代码来实现变化。
  3. 里氏替换原则(LSP,Liskov Substitution Principle):子类必须能够替换它们的基类,而不会影响程序的正确性。这个原则强调了子类必须保持基类的行为和约束。
  4. 依赖倒置原则(DIP,Dependency Inversion Principle):高层模块不应该依赖低层模块,它们应该依赖于抽象。这个原则强调了使用接口或抽象类作为依赖的类型,而不是具体的实现类。
  5. 接口隔离原则(ISP,Interface Segregation Principle):客户端不应该依赖它们不需要的接口。这个原则强调了将大接口拆分成多个小接口,以便只有需要的方法才能被客户端使用。
  6. 迪米特法则(LoD,Law of Demeter):一个对象应该对其他对象有尽可能少的了解,只与直接的朋友通信。这个原则强调了类之间的松耦合,减少对象之间的依赖关系。

     

单例模式  

     

单例模式是一种设计模式,保证一个类只有一个实例,并提供全局访问点。

单例模式的特点包括:

  1. 一个类只有一个实例对象;
  2. 该实例对象由类内部创建,并对外提供访问方法;
  3. 该类只能被实例化一次;
  4. 提供对该实例的访问方法是静态方法。

单例模式常用于需要共享或控制资源访问的情况,例如数据库连接、线程池等。单例模式可以确保只有一个实例存在,从而避免资源的浪费和冲突。

   实例

       

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点。

以下是一个简单的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实例存在,并且可以在程序的任何地方访问它。

       

总结 

    单例模式是一种创建型设计模式,它限制某个类只能创建一个实例,并提供全局访问的方式。单例模式的设计思想是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

单例模式的特点包括:

  1. 只有一个实例:单例模式确保只有一个唯一的实例存在。
  2. 全局访问点:单例模式提供一个全局访问点来获取该唯一实例。

单例模式的优点:

  1. 简化了对象的创建和访问:通过单例模式,我们可以简化对象的创建和访问过程,直接通过全局访问点获取该对象。
  2. 节省了系统资源:由于只有一个实例存在,可以节省系统资源的使用。

单例模式的缺点:

  1. 破坏了单一职责原则:由于单例模式的全局访问点,可能会导致该对象被多个模块访问和修改,从而破坏了单一职责原则。
  2. 可能引起线程安全问题:在多线程环境下,可能会引起线程安全问题,需要对单例对象进行进一步的处理来保证线程安全。

    

相关文章:

设计模式基础

什么是设计模式 设计模式是一种在软件设计过程中反复出现的问题和相应解决方案的描述。它是一种被广泛接受的经验总结,可以帮助开发人员解决常见的设计问题并提高代码的重用性、可维护性和可扩展性。 设计模式可以分为三类: 创建型模式(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,使得即使是对网页结构不熟悉…...

SAP-BASIS15-查看系统状态

...

前端怎么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){}但在最近的学习中&#xff0c;有人建议我最好应该是下面这样执行。 var str "abcdefg"; for(let i0,len str.length;i<len;i)…...

Android Audio实战——音量默认值修改(一)

在前面的文章《音频配置加载》中我们知道了,Audio 的一些配置信息是由硬件驱动保存到 audio_policy_configuration.xml 文件中,音量的一些默认值也会如此。但是在一些车载设备开发中,需要适配不同车型的需求,一套代码通常要适配多个车型,这就需要在 FW 层进行一些默认值的…...

解决uni-app progress控件不显示问题

官方代码&#xff1a; <view class"progress-box"><progress :percent"80" show-info activeColor"red" stroke-width"10" /> </view> 进度条并不在页面中显示&#xff0c;那么我们需要给进度条加上宽高style"…...

使用C++版本的opencv dnn 部署onnx模型

使用OpenCV的DNN模块在C中部署ONNX模型涉及几个步骤&#xff0c;包括加载模型、预处理输入数据、进行推理以及处理输出。 构建了yolo类&#xff0c;方便调用 yolo.h 文件 #ifndef YOLO_H #define YOLO_H #include <fstream> #include <sstream> #include <io…...

python中实现队列功能

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

自然资源-关于城镇开发边界局部优化的政策思路梳理

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

ElementUI的Table组件在无数据情况下让“暂无数据”文本居中显示

::v-deep .el-table__empty-block {width: 100%;min-width: 100%;max-width: 100%; }...

SAP-BASIS14-安装语言包

...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...