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;
    
    @Override
    public 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).使用
在这里插入图片描述

7.策略模式

根据条件(比如操作类型)而选择不同的行为或者算法,这就是策略模式,如果将不同的行为代码硬编写在一起会非常臃肿同时也不利于拓展。

1).优缺点
优点:

(1).算法可以根据条件选择
(2).利于拓展
(3).可以将公共方法抽出放在父类中,提高代码复用性

缺点:

(1).每个行为或者算法都要有一个类,这导致类的增加,导致测量膨胀
(2).所有策略类都要对外暴露,不太安全

2).应用场景

需要根据条件去选择不同的行为,比如高速公路显示屏可以根据不同指令选择播放语音、播放文字、还是点亮警报灯

3).类图

抽象类OperateHander有三个子类LineOperateHander、MusicOperateHander、PlayOperateHander,通过适配器器OperateManager根据类型去判断使用不同的Hander
在这里插入图片描述

4).具体实现

(1).编写Hander
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(2).编写枚举

@Getter
@AllArgsConstructor
public enum OperateType {

    LINE_OPERATE("line", "lineOperateHander"),
    MUSIC_OPERATE("music", "musicOperateHander"),
    PLAY_OPERATE("play", "playOperateHander"),
    ;

    private final String type;
    private final String handler;

    public static OperateType getByType(String type) {
        OperateType[] types = values();
        for (OperateType syncType : types) {
            if (syncType.getType().equals(type)) {
                return syncType;
            }
        }
        return null;
    }
}

(3).编写适配器
在这里插入图片描述

8.模版模式

模板方法模式通过定义一个抽象的父类,其中包含了流程中公共的行为,子类去实现流程中非公共的行为,这样就可以保证核心流程保持不变,同时增加了代码的复用性

1).优缺点
优点:

(1).增加代码复用性
(2).所有子类共享父类的代码,保证代码一致性
(3).利于维护

缺点:

(1).每一个非公共的行为都要增加一个子类,增加了子类的数量

2).应用场景

请假的流程和请病假的流程基本一致,都需要发起流程、主管审批、经理审批,但是请假发起流程的时候需要输入请假理由、请假天数等,但是请病假需要申请理由、请假天数、还需要医院症断书等,我们将公共部分的流程(发起、主管审批、经理审批)抽到父类,具体的差别子类去实现

3).类图

在这里插入图片描述

4).具体实现

(1).编写模版代码
在这里插入图片描述
(2).编写请假代码
在这里插入图片描述
(3).编写请病假代码
在这里插入图片描述

9.观察者模式

观察者模式定义了一种一对多的依赖关系,一个被观察者(主题)对应多个观察者,被观察者发生改变时候会通知所有观察者。观察者实现了与观察者之间的解耦。

1).优缺点
优点:

(1).观察者和被观察者是解耦合的。
(2).主题状态改变时会自动通知观察者,减少手动维护通知的工作

缺点:

(1).异步操作可能无法保证顺序一致性
(2).可能存在循环依赖的问题

2).业务场景

老师发布放假信息,所有的学生都会收到通知

3).具体实现
(1).编写观察者代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7e42afad03f542cda88f0c00d3fc71b9.png)

在这里插入图片描述
在这里插入图片描述
(2).编写主题代码
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防抖和节流的区别和举例(简要说明、形象比喻、容易理解)

1、含义: 在前端开发技术中,防抖(Debounce)和节流(Throttle)是两种常用的性能优化技术,主要用于处理高频事件触发,如用户的点击、滚动、输入等操作。 防抖(Debounce&am…

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识,借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等,旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的? Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑: 实验内容: VLAN及VLAN间路由的配置,以太通道的配置,STP的根调整,DHCPv4的配置,首跳冗余HSRP的配置。 实验最终结果: PC可以自动获取到DHCP-Server分配的IP地址,实现首跳…

【MySQL精通之路】InnoDB(5)-内存结构

总目录: 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇: 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池(Buffer Pool) 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)项目。 项目名很有意思,水壶。按项目负责人Matt的说法:把各种数据放到一个壶里,然后呢,以…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密,直接解 小小flag,拿下! 解题感悟 提示的太明显了

【Pixso如何对设计好的UI进行切片导出图片文件】

当软件UI设计好之后,并不是直接把设计图给开发就可以了,开发还会向你要各种图标的图片文件,这个时候就要用到”切片”功能了。 1、目的:把所有UI界面的图标都切下来,做成UI图标文件夹 2、在UI界面点击【】-【切片】-‘…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

聚恒中台系统 data.ashx SQL注入致RCE漏洞复现

0x01 产品简介 聚恒中台是山东聚恒网络技术有限公司打造的一款BPM流程管理系统,平台以低代码敏捷开发、流程协同、移动互联、软硬互联、大数据分析等前沿技术为支撑,平台包含8大引擎、16种业务组件,支持三种部署方式,四级权限控制,五大应用模式(PC、手机、PDA、工业平板…

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法 项目文件 随后会上传项目全部文件,和之前一样免费下载 先看效果 如上所见,能够提取图像的边缘,这个sobel边缘检测算法的阈值(认定是否为边缘的阈值)一样…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全? 猜想大部分安全从业者都会回答:“WAF(Web Application Firewall,应用程序防火墙)。”不过RASP(Runtime Application Self-Protection,应用运行时自我保护)横空出世…

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式(Composit…

C++ 写的_string类,兼容std::string, MFC CString和 C# 的string

代码例子: using namespace lf; int main() { CString s1 _t("http://www.csdn.net"); _string s2 s1; CString s3 s2; _pcn(s1); _pcn(s2); _pcn(s3); return 0; } 输出: _Str.h /***************************************…

Hsql每日一题 | day02

前言 就一直向前走吧,沿途的花终将绽放~ 题目:主播同时在线人数问题 如下为某直播平台主播开播及关播时间,根据该数据计算出平台最高峰同时在线的主播人数。 id stt edt 1001,2021-06-14 12:12:12,2021-06-14 18:1…

前端加载excel文件数据 XLSX插件的使用

npm i xlsx import axios from axios; axios //这里用自己封装的http是不行的,踩过坑.get(url,{ responseType: "arraybuffer" }).then((re) > {console.log(re)let res re.datavar XLSX require("xlsx");let wb XLSX.read(r…

【qt】标准项模型

标准项模型 一.使用标准型项模型1.应用场景2.界面拖放3.创建模型4.配套模型5.视图设置模型6.视图属性的设置 二.从文件中拿到数据1.文件对话框获取文件名2.创建文件对象并初始化3.打开文件对象4.创建文本流并初始化5.读取文本流6.关闭文件7.完整代码 三.为模型添加数据1.自定义…

【资料分享】你敢相信这些高大上的BI仪表盘都是用EXCEL做出来的?!

引言 现在大家都知道数据可视化、数据看板,几乎每个公司部门都有仪表盘的需求。 近年来,学习可视化软件的人也越来越多,国外Tableau、PowerBI就是这一领域的领先者,而国内也有不少厂家在研发数据可视化软件,比如帆软…

【C++】c++入门(下 )

c入门 1.内联函数1.1 概念1.2 特性 2.auto关键字(C11)2.1 简介2.2 auto的使用2.3 auto不能推导的场景2.4 typedef取别名也能产生和auto的效果,为什么不使用? 3.基于范围的for循环(C11)3.1 9.1 范围for的语法3.2 范围for的使用条件 4.指针空值nullptr(C11…

CSS3 新增背景属性 + 新增边框属性(如果想知道CSS3新增背景属性和新增边框属性的知识点,那么只看这一篇就够了!)

前言:CSS3在CSS2的基础上,新增了很多强大的新功能,从而解决一些实际面临的问题,本篇文章主要讲解的为CSS3新增背景属性和新增边框属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSD…