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

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

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

  • 相关阅读:
    2018 BAT最新 php面试必考题
    2018 BAT最新《前端必考面试题》
    BAT-Java必考面试题集
    BAT-Python面试题
    BAT大数据面试题
    特殊密码锁 的通过码是:(请注意,在openjudge上提交了程序并且通过以后,就可以下载到通过码。请注意看公告里关于编程作业的说明)
    OpenJudge百炼-2747-数字方格-C语言-枚举
    poj2814-拨钟问题-C语言-枚举算法
    中国MOOC_面向对象程序设计——Java语言_第4章 继承与多态_第4周编程题
    中国MOOC_面向对象程序设计——Java语言_第3周 对象容器_1查找里程
  • 原文地址:https://www.cnblogs.com/lakeslove/p/12917051.html
Copyright © 2011-2022 走看看