23种设计模式(持续输出中)

一.设计模式的作用

设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架,它提高了代码的可维护性、可扩展性、可读性以及复用性。

二.设计模式
1.工厂模式

工厂模式提供了创建对象的接口,而无需制定创建对象的具体类,工厂类封装了具体类的创建过程,客户端无需知道具体实现类只需要知道工厂类,通过工厂类来创建具体实现的类。

1).优缺点
优点:

(1).松耦合:无需知道子类具体创建过程,只需要关注工厂类。
(2).可扩展性:扩展性高,如果想增加一个产品,只需要增加子类对应的工厂类即可。

缺点:

每增加一个产品,就需要增加一个具体的类和对应的工厂类,可维护性并不高,增加了代码复杂性。

2).应用场景

使用数据库连接工厂类连接不同的数据库,比如达梦、崖山等

3).类图

在这里插入图片描述

4).具体实现过程

(1).创建一个接口
在这里插入图片描述
(2).创建实体类
在这里插入图片描述

在这里插入图片描述

(3).创建工厂类
在这里插入图片描述
(4).根据类型调用工厂类连接数据库
在这里插入图片描述

2.抽象工厂模式

抽象工厂模式是围绕一个超级工厂创建其他工厂,此超级工厂又称为其他工厂的工厂,抽象工厂模式提供了一个接口,通过此接口及其具体实现类,可以将对象的创建与客户端代码分离,从而实现系统的松耦合。

1).优缺点
优点:

(1).保证产品族一致性:抽象工厂模式创建的产品族类都是同一类产品,客户端使用此族类的产品的时候也都是使用此族类的产品。
(2).实现松耦合:客户端代码只需要通过抽象工厂接口创建产品无需知道产品具体实现代码。
(3).有利于扩展:增加新的产品族类,只需要添加新的具体工厂和产品类即可。

缺点:

每次增加产品族类都要添加一个此族类的工厂代码,还要添加此工厂的具体实现代码,系统和代码复杂性变高。

2).应用场景

比如格力和美的电器都会生产很多产品,空调、洗衣机、冰箱、热水器等,这些都是产品族类。

3).组成

抽象工厂:一般为接口,声明了创建产品对象的方法;
具体工厂:实现了抽象工厂,用于创建产品对象的具体类;
抽象产品:一般为接口或抽象类,声明实现产品的公共方法,具体产品必须要实现此方法;
具体产品:实现了抽象产品;

4).类图

在这里插入图片描述

5).具体实现

(1).创建一个接口
在这里插入图片描述
在这里插入图片描述
(2).创建接口的实体类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3).创建抽象工厂类
在这里插入图片描述

(4).创建抽象工厂类的扩展实现类
在这里插入图片描述
在这里插入图片描述
(5).创建生成器
在这里插入图片描述
(5).使用
在这里插入图片描述

3.单例模式

单例模式确保一个类只有一个实例,单例模式还需要提供一个全局访问方法

1).优缺点
优点:

(1).避免一个全局使用的类频繁地创建与销毁
(2).保证了全局状态的一致性

缺点:

(1).过度使用单例可能导致全局状态不可控

2).应用场景

获取打印机去打印图纸,可以使用单例模式去创建打印机;IP访问次数计数等;

3).具体实现
public class Singleton {//实例私有private static Singleton instance;//构造方法私有private Singleton() {}//创建实例的方法公开,如果没创建就创建实例,如果创建了就不在创建public static Singleton getInstance() {if (instance == null) {// 如果实例为空,则创建一个新实例instance = new Singleton();}return instance;}
}
4.建造者模式

建造者模式提供了一种允许用户逐步设置各种属性来构建对象的方式,很多参数对于一个对象来说可能是可选的,开发者无需传递所有参数去创建对象,对于可选的参数如果用户未传就要去除,所以我们就可以将构建复杂组件的步骤与运用组件构建对象分离,使用builder模式建立。

1).优缺点
优点:

(1).分离构建过程和表示,使得构建过程更加灵活
(2).隐藏具体构建细节,提高封装性
(3).提供代码复用性

缺点:

(1).增加代码复杂性,对于步骤简单的对象没必要使用此模式

2).应用场景

需要生成的对象具有复杂的内部结构,创建者创建对象的步骤和参数过多而且需要更加灵活

3).具体实现

比如一个用户,姓名、电话、性别是必选的,但是住址、年龄、邮箱是可选的,有些用户可能输入年龄,有些用户可能给了地址等;这里通过UserBuilder去实现根据不同的参数创建User对象;
(1).创建User类和UserBuilder类型

public class User {//名称 必填private String name;//性别 必填private String sex;//电话 必填private String phone;//年龄 可选private Integer age;//住址 可选private String address;//住址 可选private String email;public User(UserBuilder userBuilder) {this.name = userBuilder.name;this.sex = userBuilder.sex;this.phone = userBuilder.phone;this.age = userBuilder.age;this.address = userBuilder.address;this.email = userBuilder.email;}public static UserBuilder builder(String name, String sex, String phone){return new UserBuilder(name,sex,phone);}public static class UserBuilder {//名称private String name;//性别private String sex;//电话private String phone;//年龄private Integer age;//住址private String address;//住址private String email;//构造器public UserBuilder(String name, String sex, String phone) {this.name = name;this.sex = sex;this.phone = phone;}public UserBuilder age(Integer age) {this.age = age;return this;}public UserBuilder address(String address) {this.address = address;return this;}public UserBuilder email(String email) {this.email = email;return this;}public User build(){return new User(this);}}
}

(2).使用UserBuilder创建user
在这里插入图片描述

5.原型模式

原型模式通过复制现有对象来创建新对象,也就是拷贝现有的实例对象来创建对象,而不需重头创建对象。

1).优缺点
优点:

(1).提高创建对象的效率,减少创建对象成本
(2).无需知道构造函数内部逻辑,降低了耦合度

缺点:

(1).对于对象内部的引用有循环接口或者对象内部有不支持序列化的引用对象就不支持拷贝

2).应用场景

当类初始化比较复杂、比较耗时耗性能、需要获取权限等的时候需要使用原型模式

3).深拷贝和浅拷贝

(1).浅拷贝:拷贝一个对象后,基本数据类型的变量会重新创建,引用类型指向的还是原对象所指向的
(2).深拷贝:拷贝一个对象后,基本数据类型还有引用对象都是重新创建的,比如clone方法就是深拷贝

4).具体实现

(1).实体类继承Cloneable ,复写clone方法

public class User implements Cloneable {//名称 必填private String name;//性别 必填private String sex;//电话 必填private String phone;//年龄 可选private Integer age;//住址 可选private String address;//住址 可选private String email;@Overridepublic User clone() {try {return (User) super.clone();} catch (CloneNotSupportedException e) {return null;}}

(2).使用
在这里插入图片描述

6.适配器模式

通过一个适配器类将一个接口转换成另一个接口,使得两个不兼容的对象能够协同工作,从而消除不兼容问题

1).优缺点
优点:

(1).将不同的系统、库、组件适配在一起,而无需修改太多的代码,提高代码的复用性
(2).拥有更高的灵活性

缺点:

(1).过多的适配器会导致代码混乱降低维护性

2).类图

Mp4PlayerImpl专门用于播放MP4文件,Mp3PlayerImpl专门用于播放MP3,如果Mp4PlayerImpl想播放MP3文件那么就需要一个适配器Mp4PlayerAdapter去适配Mp3PlayerImpl的接口,去代理播放MP3文件。

在这里插入图片描述

3).具体实现

(1).实现MP4播放功能
在这里插入图片描述
在这里插入图片描述
(2).实现MP3播放功能
在这里插入图片描述
在这里插入图片描述
(3).实现MP4的适配器

在这里插入图片描述

(4).使用
在这里插入图片描述

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

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

相关文章

华为OD机试 - 剩余银饰的重量(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

【Python】 如何对对象列表进行排序,有点意思

在Python中,我们经常需要对对象列表进行排序,这可以通过多种方式实现。当对象是一个自定义类实例时,排序通常基于对象的一个或多个属性。Python提供了内置的sorted()函数和列表的sort()方法,它们都允许我们指定一个排序的关键字。…

iPhone彻底删除的照片怎么恢复?专业技巧助您解忧

在使用iPhone的过程中,我们可能会因为误操作或其他原因将一些重要的照片彻底删除。然而,即使照片被彻底删除,也并不意味着它们就永远消失了,它们只是被打上了“可覆盖的空间”的标签。 在照片被新数据覆盖之前,我们仍…

C语言学习【C控制语句:循环】

C语言学习【C控制语句:循环】 while循环 /* 根据用户键入的整数求和 */#include "stdio.h"int main(void) {long num;long sum 0L; /* 把sum初始化为0 */int status;printf("Please enter an integer to be summed");printf(&quo…

基于微信小程序的校园捐赠系统的设计与实现

校园捐赠系统是一种便捷的平台,为校园内的各种慈善活动提供支持和便利。通过该系统,学生、教职员工和校友可以方便地进行捐赠,并了解到相关的项目信息和捐助情况。本文将介绍一个基于Java后端和MySQL数据库的校园捐赠系统的设计与实现。 技术…

快速开发 Chrome插件

什么是 Chrome 插件 Chrome 插件程序是一种用于增强 Google Chrome 浏览器功能的小型软件应用程序。它们可以帮助用户自定义浏览体验、添加新功能、集成外部服务以及自动化任务等。扩展程序使用 HTML、CSS 和 JavaScript 编写,利用 Chrome 提供的 API 来与浏览器及…

18.分布式监控zabbix-proxy

zabbix proxy 使用场景: 监控远程区域设备监控本地网络不稳定区域当 zabbix 监控上千设备时,使用它来减轻 server 的压力简化分布式监控的维护 环境规划: zabbix-server:外网IP地址192.168.111.66 zabbix-proxy:外网IP地址192.168.111.11 内网IP地址…

AI工具推荐:提升工作效率与生活质量

有哪些好用,且国内可用的AI工具? 副本 在AI大发展的年代,还有人在工作、生活中没有使用过AI吗? 今天为大家推荐几款国内可用、好用的AI工具,不论是自媒体文案写作、打工人汇报PPT、还是论文、公文写作,总…

设计系统采购与安装:乙级资质申请的技术准备

在设计系统采购与安装方面,为乙级资质申请所做的技术准备涉及多个方面。以下是一些关键的技术准备事项: 明确技术需求:首先,需要明确乙级资质申请所需的技术系统类型和规格。这可能包括但不限于设计软件、工程管理系统、项目管理系…

【Linux】之【Get√】查看linux CPU 架构 ---- amd64、x86、x86_64、arm64

关于Linux软件下载时:amd64、x86、x86_64、arm64 的说明 archuanme -alscpu

【设计模式深度剖析】【2】【创建型】【工厂方法模式】

👈️上一篇:单例模式 | 下一篇:抽象工厂模式👉️ 目录 工厂方法模式概览工厂方法模式的定义英文原话直译 工厂方法模式的4个角色抽象工厂(Creator)角色具体工厂(Concrete Creator)角色抽象产品&#x…

关于光照模型

关于光照模型 早期学习笔记,转载自早期Excel。 存在大量格式错误、可读性非常低,建议等待作者修复后阅读、或者作为查找性材料使用。 中文名英文名/缩写说明长什么样兰伯特光照模型Lambert Lighting1.兰伯特反射(Lambert)是最常见的一种漫反射&#x…

iptables防火墙【其二 实验篇】

保存&#xff0c;还原规则 防火墙规则的备份和还原 导出&#xff08;备份&#xff09;所有表的规则 iptables-save > /opt/ipt.txt 导入&#xff08;还原&#xff09;规则 iptables-restore < /opt/ipt.txt 将iptables规则文件保存在 /etc/sysconfig/iptables 中&#xf…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速&#xff0c;可以看我往期视频&#xff0c;这回改成yolov8bytetrack实现&#xff0c;实时性更好&#xff0c;原理和原来一样。车流量进出统计车速测量优点&#xff1a; 使用目标检测算法考虑bbox抖动&#xff0c;解…

将富文本编辑器中的H标签处理成树形结构,支持无限层级

做富文本编辑器时&#xff0c;需要将文本里的标题整理成树形数据&#xff0c; // 这里是数据结构 const data [{"id": "hkyrq2ndc-36yttda0lme00","text": "阿萨德阿萨德阿萨","level": 1,"depth": 1,},{"…

Window Linux 权限提升

#基础点&#xff1a; 0、为什么我们要学习权限提升转移技术&#xff1a; 简单来说就是达到目的过程中需要用到它 心里要想着我是谁 我在哪 我要去哪里 1、具体有哪些权限需要我们了解掌握的&#xff1a; 后台权限&#xff0c;数据库权限&#xff0c;Web权限&#xff0c;用户权…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

127.数据异构方案

文章目录 前言一、数据异构的常用方法1. 完整克隆2. MQ方式3. binlog方式 二、MQ与Binlog方案实现MQ方式binlog方式注意点 三、总结 前言 何谓数据异构&#xff1a;把数据按需&#xff08;数据结构、存取方式、存取形式&#xff09;异地构建存储。比如我们将DB里面的数据持久化…

云和恩墨海外首秀在吉隆坡召开的2024中国智能科技与文化展览会

作为中马建交50周年官方重点推荐的活动之一&#xff0c;2024中国智能科技与文化展览会&#xff08;第四届&#xff09;于5月20至21日在毗邻吉隆坡双子塔的吉隆坡国际会展中心举办。本次展览会获得马来西亚科学技术创新部、马来西亚通讯部、中国驻马来西亚大使馆和马来西亚中华总…