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

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

创建型: 如何创建对象。

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

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

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

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

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

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

结构型

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时空大数据平台:激活新质生产力的智慧引擎

在数字化转型的浪潮中,时空大数据平台以其独特的价值,成为推动新质生产力发展的关键力量。本文不仅深入剖析时空大数据平台的定义与内涵,探讨其在智慧城市、智慧农业、环境管理、应急管理等领域的应用成效,还将详尽阐述平台如何通…

iPhone 16系列:摄影艺术的全新演绎,探索影像新境界

在科技的浪潮中,智能手机摄影功能的进化从未停歇。 苹果公司即将推出的iPhone 16系列,以其卓越的相机升级和创新特性,再次站在了手机摄影的前沿。 从硬件到软件,从拍照体验到图像处理,iPhone 16系列都展现了其在移动…

Windows下安装部署RocketMQ

Windows下安装部署RocketMQ 引言下载安装rocketmq配置环境变量启动NameServer启动Brokerrocketmq控制台[rocketmq-dashboard](https://github.com/apache/rocketmq-dashboard)安装及配置修改rocketmq记录日志地址设置namesrv、broker堆栈内存RocketMQ注册为Windows服务start.ba…

pod基本概念

一 、Pod Pod 是 kubernetes 基本调度单位。每个 Pod 中可以运 行一个或多个容器,共享 Pod 的文件系统、IP 和网络等 资源,每个 Pod 只有一个 IP。 1. 创建 Pod 声明式文件方式创建 Pod,支持 yaml 和 json 创建 pod 测试访问 2. 更改 Pod 的…

解决phpstudy无法启动MySQL服务

三种方法 如果说你在小皮里面,启动mysql,发现启动不了,而且你在你自己电脑本地有装过mysql服务,那么可以按照我下面的不走来,按顺序试验1,2,3,三个里面肯定有一个是可以解决的 1.停止本地的mysq…

EasyExcel 快速入门

目录 一、 EasyExcel简介 官网链接: 代码链接: 二、 EasyExcel快速上手 引入依赖: 设置Excel相关注解 编写对应的监听类: 简单写入数据: 简单读取数据: 不需要使用监听器: 需要使…

视频工具EasyDarwin将本地视频生成RTSP给WVP拉流列表

效果 ffmpeg生成rtsp流 EasyDarwin的rtsp端口默认的是10054, 使用ffmpeg将本地视频转到EasyDarwin的rtsp。 F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://127.0.0.1:10054/video11 它的直播…

Yocto - 使用Yocto开发嵌入式Linux系统_01 前言

Embedded Linux Development Using Yocto Project: Leverage the power of the Yocto Project to build efficient Linux-based products, Third Edition By: Otavio Salvador, Daiane Angolini Overview of this book Yocto 项目是开发可靠的嵌入式 Linux 项目的行业标准。与…

【网络安全】-文件包含漏洞-pikachu

文件操作漏洞包括文件上传漏洞,文件包含漏洞,文件下载漏洞。 文章目录 前言 : 什么是文件包含漏洞? 1.文件包含漏洞的分类: 本地文件包含漏洞: 远程文件包含漏洞: 2.两种文件包含漏洞的区别: 3.…

【资料分析】刷题日记2

第一套 √ 2013-2016一共有13,14,15,16四年,亦即16 - 13 1 4年 √ 是多少倍 ③vs④:都是只给出了年均增速,③求的是其中一年的,无法确定;④求的是这个时段总共的,可…

Leetcode 93-复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.…

O1-preview:智能预测与预取驱动的性能优化处理器设计OPEN AI

# 创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力! O1-preview 是一种用于性能优化的处理器设计原理,主要通过智能预测和数据预取来提升处理器的执行效率。以下是对 O1-preview 原理的详细介绍,以及它相对于以往的…

腾讯音乐 2024乐圃音乐空间夏令营:以音乐传递爱,点亮公益之光

8 月 25 日晚,在四川北川,一场充满无尽 “乐” 趣的结营音乐会,为 2024 年乐圃音乐空间夏令营画上了完美的句号。这个由腾讯音乐娱乐集团(Tencent Music Entertainment Group,以下简称 “TME”)旗下腾讯音乐…

上架谷歌安卓APP完整图文流程

本节包含以下内容: 第一步:登录Google play开发者后台第二步:创建应用第三步:设置应用第四步:开启通知第五步:发布应用第六步:查看审核结果第七步:配置app支付参数第八步&#xff1…

论文速递!时序预测!DCSDNet:双卷积季节性分解网络,应用于天然气消费预测过程

本期推文将介绍一种新的时序预测方法:双卷积季节性分解网络(Dual Convolution withSeasonal Decomposition Network, DCSDNet)在天然气消费预测的应用,这项研究发表于《Applied Energy》期刊。 针对天然气消费的多重季节性和非规律性&#x…

C++ —— 关于vector

目录 链接 1. vector的定义 2. vector的构造 3. vector 的遍历 4. vector 的扩容机制 5. vector 的空间接口 5.1 resize 接口 5.2 push_back 5.3 insert 5.4 erase 5.5 流插入与流提取 vector 并不支持流插入与流提取,但是可以自己设计,更…

二进制补码及与原码的互相转换方法-成都仪器定制

大沙把一些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。 先说原码,原码‌是一种计算机中对数字的二进制定点表示方法。在原码表示法中,数值前面增加了一位符号位,最高位为符号位,0表示正数,1表…

SPI接口通信协议浅谈成都自动化开发

沙鸥-成都 1 什么是SPI SPI是串口外设接口的缩写,是一种高速的、全双工、同步的通信协议,是微处理器与外围IC之间常用的一种通讯方式。 SPI是主从式的通信协议,可以一主机一从机通信,也可以一主机多从机通信。 2 SPI的优缺点 SPI接…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参:出现在在模板参数列表中,跟在class或者typename之类的参数类型名称。 ② 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:…