第2章 Spring中常用的设计模式
这一章共110页,讲解了11种设计模式。
详细的设计模式推荐菜鸟教程https://www.runoob.com/design-pattern/design-pattern-intro.html
设计模式一共25种,主要原则是下面这两条。
- 对接口编程而不是对实现编程。
- 优先使用对象组合而不是继承。
工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接
口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式让类的
实例化推迟到子类中进行。
简单工厂是一个工厂类
工厂模式是一个工厂接口和多个工厂实现类
抽象工厂模式是在工厂模式的基础上,工厂类接口的返回值是接口类型。
单例模式 Spring 框架应用中的ApplicationContext、数据库的连接池等也都是单例形式
可以用反射和反序列化破坏单例模式,解决方案是:
反射的解决方案是在构造器里检查是否出现第二个实例。
序列化的解决方案是添加 private Object readResolve(){ return INSTANCE; },
缺点是ObjectInputStream的readObject()方法在调用readResolve()之前会new一个新的对象,导致资源浪费。
枚举单例模式解决了这两个问题:
参考: https://blog.csdn.net/weixin_36586120/article/details/105522491
/** * 枚举单例-饿汉,推荐
* id增加器 */ public enum IdGeneratorEnum { INSTANCE; private AtomicLong id = new AtomicLong(0); public long getId() { return id.incrementAndGet(); } }
原型模式,给出副本,注意浅克隆和深克隆的区别
浅克隆 实现implements Cloneable,调用super.clone()即可,也可以自己实现。
深克隆工具类如下:即使是字符串属性也会new一个新的。
public class CloneUntil { public static <T> T deepClone(T t) { try { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(t); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (T) oi.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } }
代理模式:
Subject是顶层接口,RealSubject是真实对象(被代理对象),
Proxy是代理对象,代理对象持有被代理对象的引用,
客户端调用代理对象的方法,同时也调用被代理对象的方法,但是会在代理对象前后增加一些处理代码。
无论是动态代理还是静态代理,本质上步骤为:构建代理,把被代理对象赋值给代理的一个属,调用代理的特定方法。
区别是:动态代理需要继承GPInvocationHandler,构建方法返回的是GPProxy.newProxyInstance,调用的方法是invoke()
静态代理每个方法都要写一个对应的代理方法,动态代理一个invoke通用所有方法。
CGLib和JDK动态代理对比 (1)JDK动态代理实现了被代理对象的接口,CGLib代理继承了被 代理对象。 (2)JDK动态代理和CGLib代理都在运行期生成字节码,JDK动态 代理直接写Class字节码,CGLib代理使用ASM框架写Class字节码, CGlib代理实现更复杂,生成代理类比JDK动态代理效率低。 (3)JDK动态代理调用代理方法是通过反射机制调用的,CGLib代 理是通过FastClass机制直接调用方法的,CGLib代理的执行效率更高。
委派模式的基本作用就是负责任务的调用和分配,跟代理模式很像,可以看作一种特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果。
策略模式(Strategy Pattern)是指定义了算法家族并分别封装起来,让它们之间可以互相替换,此模式使得算法的变化不会影响使用算法的用户。
适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期望的另一个接口,使原本接口不兼容的类可以一起工作,属于结构型设计模式。
------------恢复内容结束------------
------------恢复内容结束------------