01 Mind Map

温故知新-设计模式篇_单例模式

02 Question&Answer

Q1: 什么是反射、它的作用是什么?

A: 运行时,动态获取这个类的信息。作用是访问对象的属性、方法、构造函数。


Q2: 反射应用场景?

A: JDBC驱动加载、SpringIOC、框架等。


Q3: 反射获取类的方式以及创建对象的方式?

A: 3种方式,创建对象:clazz.newInstance()。


Q4: 如何禁止反射?

A: 将构造函数私有化。


Q5: 类加载机制原理,以及各个流程做的事情?

A:

加载(​数据结构放到方法区,生成Class对象​) ->

校验(​基于字节流(文件校验)、基于数据结构(方法区里的对象结构)​)->

准备(​分配内存、初始化变量​)->

解析 (​符号引用转为直接引用​)->

初始化(​new 的方式或者反射,会找到main入口开始执行​)


Q6: 为什么加载MySQL驱动,必须先声Class.forName(“com.mysql.driver…”)?

A: 因为驱动是没有加载进去的,需要Class.forName()去加载class对象到内存,而Driver驱动类里面有个静态代码块,直接new Driver()了,把对象加载载进去到内存。


Q7: 设计模式的六大原则?

A: 「​开闭原则​」、「​里式替换原则​」(基类出现,子类一定可以出现)、「​依赖倒置原则​」(面向接口编程)、「​接口隔离原则​」、「​迪米特原则​」(减少实体间的交互)、「​合成复用原则​」(尽可能使用聚合,而不是继承)。


Q8: 单例模式的应用场景?


Q9: 单例模式的5种创建方式,以及优缺点分析?

A: 「饿汉式」、「懒汉式」、「双重锁检测」、「静态内部类」、「枚举方式」。优缺点从是否需要懒加载考虑。


Q10: 单例模式如何防止反射漏洞攻击?

A: 加个flag,只允许初始化一次,构造函数里判断。


Q11: 单例模式如何防止反射漏洞攻击?

A: 加个flag,只允许初始化一次,构造函数里判断。


Q12: 工厂模式的3中分类,以及各自的优缺点?

A: 『简单工厂模式』、(缺点高内聚、所有职责一个类处理)『工厂方法模式』(由具体的工厂子类去创建)、『抽象工厂』(工厂的工厂,再细分)。


Q13: 代理模式的概念以及3种分类?

A: 静态代理、动态代理(JDK代理)、Cglib字节码操作库。


Q14: Spring中使用那种代理模式?

A: 动态代理(JDK代理)、Cglib字节码操作库(自动转换,看是否有实现接口)。


Q15: 建造者模式的应用场景?

A: 创建游戏人物,按顺序创建肢体。


Q16: 模板方法模式以及实际应用场景?

A: 父类约定规则,子类具体实现,如银行转账案例(基类)。


Q17: 适配器模式举例?

A: 110V电源与220V电源的适配、不同数据库之间的同步等。


Q18: 外观模式举例?

A: 群发信息。


Q19: 原型模式举例?

A: 深复制与浅复制。


Q20: 装饰模式举例?

A: 房子装修、文件流。


Q21: 策略模式举例?

A: 会员案例、以及AudioPlayer的实际场景。


Q22: 观察者模式举例?

A: 。。。