当前位置: 首页 > 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数据…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...