java的23种设计模式(该在什么场景下选择哪种设计模式配合使用,提高代码的质量)

设计模式总结

创建型模式

  • 核心作用:用来帮助我们创建对象。

1.单例模式

  • 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
  • 通俗易懂:就像你有件事每天都要做,你可以让你的秘书帮你做,你可以让他每天都帮你做,而不是要很多个秘书,如果是很多个秘书,你需要每天都重复告诉他们,你要做什么,这样很麻烦,你每天都要花多余的时间跟他说需要做什么。就像程序里面,你对象创建一次就行了,而不是每次执行方法都要创建一次对象,很浪费资源。
  • 单例模式实现: https://blog.csdn.net/qq1021979964/article/details/87535219

2.工厂模式

  1. 简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
  2. 工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
  3. 抽象工厂模式:用于生产不用产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

3.建造者模式

  • 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。
  • 通俗易懂:比如肯德基的套餐是是复杂的对象,它里面包含很多种食物,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而肯德基的服务员可以根据你的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后再给你。
  • 建造者模式实现: https://blog.csdn.net/qq1021979964/article/details/87554065

4.原型模式

  • 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以是用原型模式
  • 通俗易懂:比如你要写一篇文章,内容只跟之前你写的文章有一些差异的时候,你可以复制之前你写的文章进行修改那些差异,是不是比你一个字一个字重新写的方便。就像程序中一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
  • 原型模式实现: https://blog.csdn.net/qq1021979964/article/details/88102023

结构型模式

  • 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。

5.适配器模式

  • 使原本由于接口不兼容不能一起工作的类可以一起工作
  • 通俗易懂:比如你的数据线只能充安卓手机的电,你可以做一个适配器将苹果的也接到一起,这样你的数据线就能充安卓的也能苹果手机的电了。
  • 适配器模式实现: https://blog.csdn.net/qq1021979964/article/details/88116075

6.代理模式

  • 为真实对象提供一个代理,从而控制对真实对象的访问
  • 通俗易懂:比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。
  • 代理模式实现: https://blog.csdn.net/qq1021979964/article/details/88116809

7.桥接模式

  • 处理多层次继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
  • 通俗易懂:主要是实现系统可以有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间的耦合。
  • 桥接模式实现:  https://blog.csdn.net/qq1021979964/article/details/88203486

8.组合模式

  • 将对象组合成树状结构以表示“部分和整体”层次结构,使得客户可以统一的调用叶子对象和容器对象。
  • 通俗易懂:用在树形结构,比如你有一个收藏文件夹,在里面分为视频文件夹,图片文件夹,文本文件夹,每个文件夹又细分,比如文本文件夹又分为word,txt文件夹等等,你可以选择只对txt文件夹杀毒,也可以对这个收藏文件夹杀毒,比如对收藏文件夹杀毒,它会找到视频文件夹杀毒,将里面的文件杀完毒之后继续返回对图片文件夹杀毒直到杀完毒。
  • 组合模式实现: https://blog.csdn.net/qq1021979964/article/details/88254608

9.装饰模式

  • 动态地给一个对象添加额外的功能,比继承灵活。
  • 通俗易懂:比如你去喝奶茶,有珍珠奶茶,椰果奶茶等等,你选择喝珍珠奶茶,你也可以加钱跟服务员说里面还要加椰果,红豆等等。
  • 装饰模式实现: https://blog.csdn.net/qq1021979964/article/details/88258469

10.外观模式

  • 为子系统提供统一的调用接口,使得子系统更加容易使用。
  • 通俗易懂:比如你要喝茶,如果是自己泡茶,你需要煮水,准备茶具,买茶叶,才能泡茶。太麻烦了,你可以去茶馆,告诉服务员你要喝什么茶,服务员就会给你泡好茶再给你,你就不需要自己去一个个的做。
  • 外观模式实现: https://blog.csdn.net/qq1021979964/article/details/88365398

11.享元模式

  • 运行共享技术有效的实现管理大量细粒度对象,节省内存,提高效率。
  • 通俗易懂:内存属于稀缺资源,不能随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。
  • 享元模式实现: https://blog.csdn.net/qq1021979964/article/details/88365830

行为型模式

  • 核心作用:关注系统中对象的相互交互,研究系统运行时对象之间的相互通信和协助,进一步明确对象的职责。

12.责任链模式

  • 避免请求发送者和接收者耦合,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理为止。
  • 通俗易懂:就像是try...catch,发生异常的时候交给第一个catch处理,第一个不能处理就让第二个,一直下去直到被处理。
  • 责任链模式实现: https://blog.csdn.net/qq1021979964/article/details/88366337

13.迭代者模式

14.中介者模式

  • 通过一个中介对象来封装一系列的对象交互,使得各对象不需要相互引用。
  • 通俗易懂:就像人才市场一样,你只需要把你的简历和要求告诉人才市场就行,人才市场会帮你找符合你要求的工作,然后让你去面试,而不需要你一个个公司的挑取符不符合你的要求,找到符合的再逐个投简历。
  • 中介者模式实现: https://blog.csdn.net/qq1021979964/article/details/88366858

15.命令模式

  • 将一个请求封装成一个对象,从而使得请求调用者和请求接收者解耦。
  • 通俗易懂:比如你是领导,你要做一件事需要5个人去完成,你只需要将你的命令告诉你的秘书,由你的秘书去找5个人帮你完成你的事情。
  • 命令模式实现: https://blog.csdn.net/qq1021979964/article/details/88367144

16.解释器模式

  • 描述如何为语言定义一个文法,如何解析
  • 通俗易懂:比如你写了特定的正则表达式,你需要告诉程序怎么解析这个正则表达式。再比如:你写了一个x=1+2,你要告诉程序,x是将1和2相加起来,就是等于3。
  • 解释器模式实现: https://blog.csdn.net/qq1021979964/article/details/88428345

17.访问者模式

  • 表示一个作用于某对象结构中的各元素的操作,它使得用户可以在不改变个元素的类的前提下定义作用域这些元素的新操作。
  • 通俗易懂:比如你是做生意的,一天下来有很多笔收入和支出,你可以统计今天的所有收入和支出,还可以统计哪类的商品收入比较高,但你今天的收入和支出是已经发生了,你不能改变它。再比如:有一个文件夹设置的权限是只读,你可以看里面的文件,根据里面的文件内容做别的操作,但你没有权限修改里面的文件和文件夹。
  • 访问者模式实现:https://blog.csdn.net/qq1021979964/article/details/88428883

18.策略模式

  • 定义一系列的算法,并将每个算法封装在一个类中。
  • 通俗易懂:比如商场打折扣,针对不同的人群给不同的折扣,这时,我们可以每一种人群定义一个类,让它实现不同折扣的功能,然后收银员告诉系统他属于哪种人,系统就会提供他的折扣是怎么样的。用if..else也行,但是人群分类特别多的时候,if...else就会特别长,所以我们可以使用策略模式。
  • 策略模式实现: https://blog.csdn.net/qq1021979964/article/details/88429245

19.模板方法模式

  • 定义一个操作的算法骨架,将这些易变的步骤延迟到子类中实现
  • 通俗易懂:比如你去银行办理业务,有三个步骤,排队取号,办理具体业务,给银行人员好评,其中办理具体业务是会容易变的,比如你今天要去取钱,明天要去存钱,后天要去理财。像这样你就可以用模板方法将具体的业务作为接口,而排队取号和给银行人员好评都是固定的。
  • 模板方法实现: https://blog.csdn.net/qq1021979964/article/details/88429599

20.状态模式

  • 允许一个对象在其内部状态改变时改变它的行为
  • 通俗易懂:比如一个人就有很多种状态,睡觉,上班,运动等。它们是有关系的,就像你睡觉的时候不可能同时上班吧,并且你每种状态的行为都是不一样的,你睡觉的时候是闭着眼睛跟周公约会的,上班的时候需要工作的。
  • 状态模式实现: https://blog.csdn.net/qq1021979964/article/details/88430112

21.观察者模式

  • 当一个对象状态改变时,其相关依赖对象皆得到通知并自动更新
  • 通俗易懂:就跟发布订阅一样,比如:你订阅公众号,公众号有推文会将推文自动发送给你。
  • 观察者模式实现: https://blog.csdn.net/qq1021979964/article/details/88558878

22.备忘录模式

  • 捕获一个对象的内部状态,并且保存。需要时,可以恢复到保存的状态
  • 通俗易懂:使用word文档的时候,不小心电脑关机了,重新开机之后会提示你要不要恢复到之前的状态。
  • 备忘录模式实现: https://blog.csdn.net/qq1021979964/article/details/88429245

猜你喜欢

转载自blog.csdn.net/xiaomojun/article/details/112273156