一、什么是设计模式

设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

二、设计模式分类

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

三、设计模式的六大原则

开放封闭原则(Open Close Principle)
原则思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
优点:单一原则告诉我们,每个类都有自己负责的职责,里氏替换原则不能破坏继承关系的体系。

里氏代换原则(Liskov Substitution Principle)
原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。
大概意思是:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。
优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。

依赖倒转原则(Dependence Inversion Principle)
依赖倒置原则的核心思想是面向接口编程.

依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,

这个是开放封闭原则的基础,具体内容是:对接口编程,依赖于抽象而不依赖于具体。

接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
例如:支付类的接口和订单类的接口,需要把这俩个类别的接口变成俩个隔离的接口

迪米特法则(最少知道原则)(Demeter Principle)
原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦
大概意思就是一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
优点:低耦合,高内聚。

单一职责原则(Principle of single responsibility)
原则思想:一个方法只负责一件事情。
描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。 这是常识,几乎所有程序员都会遵循这个原则。
优点:降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险。

四、单例模式

1.什么是单例
保证一个类只有一个实例,并且提供一个访问该全局访问点

2.那些地方用到了单例模式
网站的计数器,一般也是采用单例模式实现,否则难以同步。
应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。
多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。

3.单例优缺点

优点:在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例
单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
提供了对唯一实例的受控访问。
由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
允许可变数目的实例。
避免对共享资源的多重占用。
缺点:不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
单例类的职责过重,在一定程度上违背了“单一职责原则”。
滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

4.单例模式使用注意事项:
使用时不能用反射模式创建单例,否则会实例化一个新的对象
使用懒单例模式时注意线程安全问题
饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)

5.如何选择单例创建方式

如果不需要延迟加载单例,可以使用枚举或者饿汉式,相对来说枚举性好于饿汉式。
如果需要延迟加载,可以使用静态内部类或者懒汉式,相对来说静态内部类好于懒韩式。
最好使用饿汉式。

五、工厂模式

1.工厂模式好处

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

2.Spring开发中的工厂设计模式

1).Spring IOC

看过Spring源码就知道,在Spring IOC容器创建bean的过程是使用了工厂设计模式

Spring中无论是通过xml配置还是通过配置类还是注解进行创建bean,大部分都是通过简单工厂来进行创建的。

当容器拿到了beanName和class类型后,动态的通过反射创建具体的某个对象,最后将创建的对象放到Map中。

2).为什么Spring IOC要使用工厂设计模式创建Bean呢

在实际开发中,如果我们A对象调用B,B调用C,C调用D的话我们程序的耦合性就会变高。(耦合大致分为类与类之间的依赖,方法与方法之间的依赖。)

在很久以前的三层架构编程时,都是控制层调用业务层,业务层调用数据访问层时,都是是直接new对象,耦合性大大提升,代码重复量很高,对象满天飞

为了避免这种情况,Spring使用工厂模式编程,写一个工厂,由工厂创建Bean,以后我们如果要对象就直接管工厂要就可以,剩下的事情不归我们管了。Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。

3).工厂模式分类及实例http://t.csdn.cn/Lyisn

六、代理模式

1.什么是代理模式
通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理/添加新的功能。(也就是AO的P微实现)

代理在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这也和Spring的(面向切面编程)很相似

2.代理模式应用场景
Spring AOP、日志打印、异常处理、事务控制、权限控制等

3.代理的分类
静态代理(静态定义代理类)
动态代理(动态生成代理类,也称为Jdk自带动态代理)
Cglib 、javaassist(字节码操作库)

4.三种代理的区别
静态代理:简单代理模式,是动态代理的理论基础。常见使用在代理模式
jdk动态代理:使用反射完成代理。需要有顶层接口才能使用,常见是mybatis的mapper文件是代理。
cglib动态代理:也是使用反射完成代理,可以直接代理类(jdk动态代理不行),使用字节码技术,不能对 final类进行继承。(需要导入jar包)

5.代码演示三种代理模式:http://t.csdn.cn/2jFZy

七、原型模式

1.什么是原型模式
原型设计模式简单来说就是克隆

原型表明了有一个样板实例,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

2.原型模式的应用场景
类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。这时我们就可以通过原型拷贝避免这些消耗。
通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。
我们Spring框架中的多例就是使用原型。

3.原型模式的使用方式
实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此Prototype类需要将clone方法的作用域修改为public类型。

原型模式分为浅复制和深复制
(浅复制)只是拷贝了基本类型的数据,而引用类型数据,只是拷贝了一份引用地址。

(深复制)在计算机中开辟了一块新的内存地址用于存放复制的对象。

4.代码演示

1.创建User类

package com.lijie;import java.util.ArrayList;public class User implements Cloneable {private String name;private String password;private ArrayList<String> phones;protected User clone() {try {User user = (User) super.clone();//重点,如果要连带引用类型一起复制,需要添加底下一条代码,如果不加就对于是复制了引用地址user.phones = (ArrayList<String>) this.phones.clone();//设置深复制return user;} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}//省略所有属性Git Set方法......
}

2.测试复制

package com.lijie;import java.util.ArrayList;public class Client {public static void main(String[] args) {//创建User原型对象User user = new User();user.setName("李三");user.setPassword("123456");ArrayList<String> phones = new ArrayList<>();phones.add("17674553302");user.setPhones(phones);//copy一个user对象,并且对象的属性User user2 = user.clone();user2.setPassword("654321");//查看俩个对象是否是一个System.out.println(user == user2);//查看属性内容System.out.println(user.getName() + " | " + user2.getName());System.out.println(user.getPassword() + " | " + user2.getPassword());//查看对于引用类型拷贝System.out.println(user.getPhones() == user2.getPhones());}
}

3.如果不需要深复制,需要删除User 中的:

//默认引用类型为浅复制,这是设置了深复制
user.phones = (ArrayList<String>) this.phones.clone();

Java设计模式面试题总结相关推荐

  1. Java设计模式面试题(一)

    Java设计模式面试题(一) 请列举出在JDK中几个常用的设计模式 单例模式用于Runtime,Calender和其他的一些类中. 工厂模式被用于各种不可变的类,如Boolean.valueOf. 观 ...

  2. Java设计模式面试题及答案(持续更新。。。)

    Java面试题及答案(2022版),每道都是认真筛选出的高频面试题,助力大家能找到满意的工作! Java设计模式面试题及答案 下载链接:全部面试题及答案PDF 1.请列举出在 JDK 中几个常用的设计 ...

  3. java设计模式面试题大全含答案

    java设计模式面试题大全含答案 1.23种经典设计模式都有哪些,如何分类? 2.j2ee常用的设计模式?说明工厂模式. 3.Spring 框架中都用到了哪些设计模式? 4.<java面试宝典& ...

  4. 阿里java设计模式面试题汇总(附答案),看看你都掌握了吗

    1.接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API.它定义了类必须得遵循的规则.同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使 ...

  5. Java设计模式面试题

    1.请列举出在 JDK 中几个常用的设计模式? 单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中.工厂模式 (Factory pattern)被用 ...

  6. Java面试题:Java设计模式11道常见面试题

    想要找到一份好的工作,面试是少不了的,本文收录了一些Java基础面试题,学习没有捷径,希望大家都能少走一些弯路,2021Java面试题赶快学习起来吧. Java基础面试题, 请列出JDK中几种最常用的 ...

  7. 【2022最新Java面试宝典】—— 设计模式面试题(14道含答案)

    目录 1.什么是设计模式 2.为什么要学习设计模式 3.设计模式分类 4.设计模式的六大原则 5.单例模式 1.什么是单例 2.那些地方用到了单例模式 3.单例优缺点 4.单例模式使用注意事项: 5. ...

  8. java设计模式的一些面试题整理

    Java设计模式相关面试 这里面试一些简单的面试题 Java高级面试设计模式 这里面试一些简单的面试题 1.接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API.它定义了类必须得遵 ...

  9. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

最新文章

  1. 19张图带你梳理SpringCloud体系中的重要技术点!
  2. 微信小程序code 换取 session_key
  3. python与其他编程语言对比优点_Python编程不同于其他编程语言的优点
  4. 系统间通信2:通信管理与远程方法调用RMI
  5. Linq使用Group By
  6. ip服务器ip地址信息配置,服务器ip地址配置
  7. 集群的可扩展性及其分布式体系结构(2)-下
  8. Leetcode 214.最短回文串
  9. JAVA------华为----------句子逆序
  10. Oracle exp/imp导入不同的表空间
  11. 爱加密:APP安全防护 靠技术实力说爱你
  12. linux装逼指南-数字雨
  13. 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记
  14. 钢板弹簧matlab,Matlab/GUI在钢板弹簧悬架设计中的应用
  15. 可控硅型号怎样识别_可控硅的鉴别
  16. linux 下不错的html编辑器bluefish_php_sir_新浪博客
  17. 真的羡慕玉自寒和烈如歌的爱情
  18. 云服务器通过域名访问自己的项目
  19. 科教导刊杂志科教导刊杂志社科教导刊编辑部2022年第9期目录
  20. 航天科工自行研发“反无人机”系统,综合拦截成功率高达80%

热门文章

  1. 微信小程序页面在调取到接口数据之前是加载中状态
  2. 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
  3. 清除xp,win7快捷方式小箭头
  4. 从appstore快速安装Xcode 8.0_如何解决xcode8安装慢的问题
  5. webrtc USB摄像头
  6. 软件License认证方案的设计思路
  7. java定时任务工具详解之Quartz
  8. ap计算机知识点总结,AP Calculus(ABBC)知识点总结
  9. 怎么在vscode上面使用git仓库管理工具
  10. web测试bug清单