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

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

创建型: 如何创建对象。

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

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

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

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

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

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

结构型

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

优化算法(三)—模拟退火算法(附MATLAB程序)

模拟退火算法(Simulated Annealing, SA)是一种基于概率的优化算法,旨在寻找全局最优解。该算法模拟金属退火过程中的物质冷却过程,逐渐降低系统的“温度”以达到全局优化的效果。它特别适用于解决复杂的组合优化问题。 一、模拟退…

[产品管理-21]:NPDP新产品开发 - 19 - 产品设计与开发工具 - 详细设计与规格定义

目录 前言: 一、详细设计与规格定义概述 1、产品详细设计 2、规格定义 3、详细设计与规格定义的关系 4、实际应用中的注意事项 二、详细设计与规格定义主要工具 2.1 质量功能展开QFD - 需求跟踪矩阵 1、QFD的基本原理 2、QFD的实施步骤 3、QFD的优势与应…

人工智能开发实战matplotlib库应用基础

内容导读 matplotlib简介绘制直方图绘制撒点图 一、matplotlib简介 matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成高质量的图形。 matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 我们只需几行代码…

解锁全球机遇:澳大利亚服务器租用市场的独特魅力

在浩瀚的全球数字版图中,澳大利亚以其独特的地理位置、丰富的资源禀赋、以及日益增长的数字经济活力,成为了众多互联网企业竞相布局的重要市场。特别是当谈及服务器租用这一关键环节时,澳大利亚以其稳定的网络环境、先进的基础设施和开放的市…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):802 标注数量(xml文件个数):802 标注数量(txt文件个数):802 标注类别…

知识竞赛活动舞台搭建要多少钱

每次举办活动,舞台搭建总是让人头疼的一部分,尤其是费用问题。今天就来揭开活动舞台搭建费用的神秘面纱。 活动舞台搭建的费用主要包括舞台结构、设备、音响、灯光、舞美装饰等各方面的成本。具体来说: 1.舞台结构:包括舞台平台…

5.TensorBoard的使用(二)--add_image()

TensorBoard的使用(二) 1.使用add_image()给添加图片 首先导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的实例,并将所有的事件文件保存在logs文件夹中 writer SummaryWriter(logs)使用add…

完整版订单超时自动取消功能

前几天对实习还是继续学习技术产生了抉择,问了一个前辈,他抛给我一个问题,怎么做15分钟订单自动取消,我说然后到时间之后,自动执行这个订单关闭业务,比如把锁了的库存给解开等等操作,然后在数据…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候,一般会选择如下三种数据…

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)

一、场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同 1.什么是测试片段? 1)就相当于只是项目的一部分用例,不能单独运行,必须要和控制器(include,模块)一…

C++——哈希unordered_set/unordered_map的封装

目录 前言 二、unordered_set的封装 1.模板参数列表的改造 2. 增加迭代器操作 3. 模板参数的意义 三、unordered_map的封装 1、“轮子所需要的参数 2、迭代器 四、完整代码 1、HashTable 2、unordered_set 3、unordered_map 总结 前言 unordered_set和map的介绍在上一篇博客有…

2、.Net 前端框架:ASP.Net Core - .Net宣传系列文章

ASP.NET Core 是一个跨平台、高性能、开源的框架,用于构建现代化的、基于云的、互联网连接的应用程序。它是微软对原始ASP.NET框架的重构和扩展,提供了更多的灵活性和改进的性能。ASP.NET Core 可以用于开发Web应用程序、Web API、以及服务端渲染的Web页…

windows系统docker装milvus向量数据库

首先创建一个文件夹比如milvus,在创建如下文件 docker-compose.yml文件如下: version: 3.5services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.5environment:- ETCD_AUTO_COMPACTION_MODErevision- ETCD_AUTO_COMPACTION_RETENTION1000- ETCD_QUOTA_B…

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习

流程:1.Python爬虫采集物流数据等存入mysql和.csv文件;2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs;3.使用hive数据仓库完成建库建表导入.csv数据集;4.使用hive之hive_sql进行离线计算&#xff…

Qt常用控件——QComboBox

文章目录 核心属性、方法、信号模拟点餐文件加载 核心属性、方法、信号 QComboBox表示下拉框 核心属性: 属性说明currentText当前选中文本currentIndex当前选中的条目下标editable是否允许修改设置为true时,QComboBox的行为就非常接近于QLineEdit&…

【智路】智路OS Airos Edge 2.0 Quick Start

Airos Edge 2.0 Quick Start 1 智路OS2.0 1.1 简介 智路OS路侧操作系统airos-edge自下而上分别由内核层,硬件抽象层、框架层、服务层和应用层构成;提供了一系列抽象和框架,支持设备接入、服务、应用等组件开发,兼容X86和ARM操作…

【光照增强论文略读】Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement

这篇题为《用于低光照图像增强的零参考深度曲线估计》的论文介绍了一种名为Zero-DCE的创新方法,用于增强低光照图像。其主要创新点在于,它在训练过程中不需要成对或非成对的参考图像,因此是一种“零参考”方法。通过轻量级深度学习模型DCE-Ne…

SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report

上一章讲了Fiori UI5开发环境搭建和实践: - VSCode 安装Fiori Tools插件 - SEGW 创建后台程序,注册服务,Gateway Client确认服务 - 使用SEGW公开的服务来查询数据显示到页面 SAP学习笔记 - 开发05 - Fiori UI5 开发环境搭建2 Fiori Tools…

北极星计划的回响:从Leap Motion到Midjourney的AI 3D硬件梦想

在科技的浩瀚星空中,总有一些梦想如同北极星般璀璨,指引着探索者前行。六年前,Leap Motion的CEO David以一篇充满激情的博客文章,向我们揭示了“北极星计划”——一个旨在打破数字与物理界限,创造流畅统一体验的增强现实平台。今天,随着Midjourney在AI文生图领域的全球爆…

使用OpenFeign在不同微服务之间传递用户信息时失败

文章目录 起因原因解决方法: 起因 从pay-service中实现下单时,会调用到user-service中的扣减余额。 因此这里需要在不同微服务之间传递用户信息。 但是user-service中始终从始至终拿不到user的信息。 原因 在pay-service中,不仅要Enable O…