第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)是指将一个类的接口转换成用户期望的另一个接口,使原本接口不兼容的类可以一起工作,属于结构型设计模式。

------------恢复内容结束------------

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/lakeslove/p/12917051.html