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

【面向对象】设计模式分类

java中设计模式共23种,根据使用场景可分为创建型模式结构型模式行为型模式

创建型: 如何创建对象。

单例模式:保证一个类在一个程序中只能创建一个对象。例如windows任务管理器窗口只需要创建一个。单例模式只创建一个对象,这个对象由单例类自己创建,并向外提供访问方法。

        实现方式有两种:
        1.饿汉式(急切式):在类加时就把唯一单例对象创建好了。
        2.懒汉式:在类加载时并不创建单例对象,在第一次获取单例对象时才创建。存在线程安全问题,解决办法是双重检索 + volatile关键字。

简单工厂:有一个工厂类,负责生产某一类产品。同一类产品,具备同一个抽象父类(抽象类,接口)。将创建对象与使用对象分离(spring框架就是这种设计思想)。简单工厂违背了开闭原则,添加一个产品,就需要修改工厂代码。

工厂方法:对工厂进行抽象,一个抽象的产品对应一个抽象的工厂;一个具体的产品对应一个具体的工厂;一个具体的工厂负责生产一个具体的产品。需要扩展新产品时,只需要添加新的具体产品类和新的生产该产品的具体工厂类即可,这样就不需要修改原来的工厂,符合开闭原则。

抽象工厂:生产一系列产品(某个公司的产品:小米手机、小米汽车、小米电视等),在抽象的工厂中定义生产不同的产品,具体的工厂负责生产一个公司的一系列产品。

原型模式:在开发过程需要创建多个数据相同的对象,因为每次使用new创建开销比较大,所以使用对象克隆,以先创建出来的原型对象为模板进行对象复制,提高了创建效率。例如简历:写一份,复制多份;奖状:复制多份,学校信息一致,只要填写名字即可。

结构型

代理模式:目标对象的代理者。汽车厂卖汽车,不可能自己去卖,可以让4s店代理去卖。4s店不光可以卖汽车,还可以帮助客户上牌、买保险、提供售后等。帮助目标(实际的执行者)增加额外的功能,而不用修改目标代码。

        优点:将目标与添加的功能相分离,保护目标对象,耦合度降低,增加新的功能不需要修改目标对象。

        代理实现可以分为静态代理和动态代理:

        静态代理:一个代理类可以对某一类的目标提供代理,满足开闭原则(添加一类目标时,可以扩展添加一个新的代理类),代码是写死的,不灵活。对于框架这种场景就不太适合,因为框架要对任意的类进行代理,静态代理就不能满足需求了。在我们项目中,如果只对某类对象进行代理,可以选择静态代理。

        动态代理:在运时可以动态创建代理类,分为 jdk 代理cglib 代理:

        jdk 代理:创建一个代理对象生成器,实现InvocationHandler,重写invoke方法,此方法会被代理动态调用。代理对象在运行时,被动态的创建,可以代理任意的目标对象,提高灵活性。但是被代理的目标对象,必须实现一个接口,在生成代理对象时,需要通过接口来获取目标对象信息。底层实现使用的是反射机制。

        cglib 代理:不需要目标类去实现接口,采用动态字节码生成技术,为我们的目标类生成一个子类对象。当调用方法时,对方法进行拦截,调用目标类方法。要求目标类不能是 final 修饰的,方法也不能是 final 和 static 修饰的。、

        spring 框架中两种代理生成机制都实现了:可以根据目标是否实现接口,自动选择生成代理对象的方式,默认采用 cglib 代理生成。

适配器模式:为两个互不相通的事物之间提供一个转换器,使得两者可以互通。

模版方法模式:在程序开发中,有些实现步骤的流程是固定的。可以抽取父类,在父类中实现各个步骤,再在父类中定义一个流程控制方法,在此方法中按照步骤调用执行。将某个容易发生变化的步骤定义为抽象方法,针对不同的情况,可以扩展一个子类实现抽象方法。最终是由子类对象调用父类中流程控制的方法即可。

相关文章:

【面向对象】设计模式分类

java中设计模式共23种,根据使用场景可分为创建型模式、结构型模式、行为型模式。 创建型: 如何创建对象。 单例模式:保证一个类在一个程序中只能创建一个对象。例如windows任务管理器窗口只需要创建一个。单例模式只创建一个对象&#xff0…...

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…...

中泰免签,准备去泰国旅游了吗?《泰语翻译通》app支持文本翻译和语音识别翻译,解放双手对着说话就能翻译。

泰国是很多中国游客的热门选择,现在去泰国旅游更方便了,因为泰国对中国免签了。如果你打算去泰国,那么下载一个好用的泰语翻译软件是很有必要的。 简单好用的翻译工具 《泰语翻译通》App就是为泰国旅游设计的,它翻译准确&#x…...

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一:子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二:显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…...

OpenMV学习第一步安装IDE_2024.09.20

用360浏览器访问星瞳科技官网,一直提示访问不了。后面换了IE浏览器就可以访问。第一个坑。...

RK3568平台(基础篇)万用表的使用

一.万用表的通断判断 万用表两个笔头的插法:黑笔头是插在COM的孔里面,红色笔头可以插在其他的三个孔里面,20A和mA分别用来测电流,另外一个孔可以用来测其他(电压 电阻)。 以下这个三角符号(像wifi一样的)可以用来测通断: 使用万用表的红笔和黑笔进行短接,这时候两端…...

more、less 命令:阅读文本

一、命令简介 ​more​ 和 less​ 都是用于查看文本文件内容的命令,但它们在显示方式和功能上有一些区别。 简单的说 less​ 是 more​ 的升级版:增加了搜索、跳转等功能。所以优先使用 less​,可以不用 more ​了。 ‍ 二、命令参数 基…...

【笔记】1.3 塑性变形

一、塑性变形的方式 DDWs(Dislocation-Dipole Walls,位错偶极墙):指由两个位错构成的结构,它们以一种特定的方式排列在一起,形成一个稳定的结构单元。 DTs(Dislocation Tangles,位错…...

Java集合(三)

目录 Java集合(三) Java双列集合体系介绍 HashMap类 HashMap类介绍 HashMap类常用方法 HashMap类元素遍历 LinkedHashMap类 LinkedHashMap类介绍 LinkedHashMap类常用方法 LinkedHashMap类元素遍历 Map接口自定义类型去重的方式 Set接口和Ma…...

python:给1个整数,你怎么判断是否等于2的幂次方?

最近在csdn上刷到一个比较简单的题目,题目要求不使用循环和递归来实现检查1个整数是否等于2的幂次方,题目如下: 题目的答案如下: def isPowerofTwo(n):z bin(n)[2:]print(bin(n))if z[0] ! 1:return Falsefor i in z[1:]:if i !…...

Centos7安装gitlab-ce(rpm安装方式)

本章教程,主要介绍如何在Centos7安装gitlab-ce。 一、安装基础环境 安装gitlab-ce之前,我们需要安装一下jdk版本。 sudo yum install java-11-openjdk-devel二、下载安装包 这里我们下载的是rpm包。更多gitlab-ce版本可以在这里查看:https://…...

Flutter 获取手机连接的Wifi信息

测试版本 Flutter:3.7.6Dart:2.19.3 network_info_plus: 4.0.1 前言 我在做设备配网的时候,需要选择配网的WiFi。用下拉选择框展示WiFi列表。现在有个需求:默认展示的设备为手机连接的wifi。要实现这个需求只要能够获取到手机连接的wifi信息…...

誉龙视音频 Third/TimeSyn 远程命令执行复现

0x01 漏洞描述: 誉龙公司定位为系统级的移动视音频记录解决方案提供商,凭借其深厚的行业经验,坚持自主研发,匠心打造记录仪领域行业生态,提供开放式的记录仪APK、GB28181 SDK、国网B协议、管理平台软件OEM。誉龙视音频…...

ATMEGA328P芯片引脚介绍

1.AVCC AVCC是ATmega328P芯片的模拟电源引脚。 AVCC引脚的定义 模拟电源引脚:AVCC(Analog Voltage Common)是ATmega328P微控制器中的模拟电源引脚,用于为模拟电路部分提供稳定的电源。功能描述:AVCC通常连接到一个干…...

现代前端构建工具对比:Vue CLI、Webpack 和 Vite

一、引言🌟 在现代前端开发中,选择合适的构建工具对于提高项目的效率和可维护性至关重要。🛠️ Vue CLI、📦 Webpack 和 🚀 Vite 是目前最流行的三个构建工具,它们各自具有独特的优势和适用场景。本文将深…...

代码随想录算法训练营第三九天| 198.打家劫舍 213.打家劫舍II 337.打家劫舍 III

今日任务 198.打家劫舍 213.打家劫舍II 337.打家劫舍 III 198.打家劫舍 题目链接: . - 力扣(LeetCode) class Solution {public int rob(int[] nums) {int[] dp new int[nums.length];if (nums.length 1) return nums[0];if (nums.lengt…...

阿里云AI基础设施全面升级,模型算力利用率提升超20%

来源首席数智官 9月20日,2024云栖大会现场,阿里云全面展示了全新升级后的AI Infra系列产品及能力。通过全栈优化,阿里云打造出一套稳定和高效的AI基础设施,连续训练有效时长大于99%,模型算力利用率提升20%以上。 “AI…...

Debezium日常分享系列之:将容器镜像移至 quay.io

Debezium日常分享系列之:将容器镜像移至 quay.io 在Debezium 3.0.0.Final发布之后,我们将不再向docker.io发布容器镜像更新。旧版本的Debezium 2.x和1.x镜像将继续保留在docker.io上;然而,所有未来的Debezium 2.7.x和3.x或更高版本…...

基于TCP实现聊天

TCP客户端代码 import java.io.*; import java.net.InetAddress; import java.net.Socket;public class TcpClientDemo01 {public static void main(String[] args) {Socket socket null;OutputStream os null;InputStream is null;BufferedReader reader null;try {// 1.…...

基于JavaSwing实现的酒店管理系统

一、项目介绍 > 欢迎使用酒店管理系统! > 这是一个基于Java Swing开发,用于管理酒店预订、房间、订单和用户信息的系统。 > 适用于JAVA初学者作为入门学习项目。 二、项目演示 三、基础依赖 技术/框架版本描述Java8编程语言MySQL8.0数据…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...