JAVA知识点总结——设计模式

1. 设计模式可以分为哪几类,分别有哪些设计模式?

    创建型:工厂、抽象工厂、单例、建造者和原型

    结构型:门面、组合、适配器、桥接、享元、代理和装饰器模式

    行为型:观察者、模板、策略、责任链、命令、状态、访问者、(委派,不算23种设计模式)

2.设计模式有哪些设计原则

单一职责:高内聚,相似功能放到一个类中,不想关的功能不放到一个类

开闭原则:指一个软件实体(如类、模块、和函数)应对扩展开放,对修改关闭。强调用抽象构建框架,用实现扩展细节。核心思想就是面向抽象编程。 

里氏替换原则:子类可替换父类出现的所有地方(继承准则)

                       (1)子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
                       (2)子类可以增加自己特有的方法。
                       (3)当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
                       (4)当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或与父类一样

接口隔离原则:用多个专门的接口,而不使用单一的总接口,即提供客户端需要的接口,不强迫客户端依赖它不需要的接口或功能

依赖置换原则:高层不依赖低层,高层和低层关联于抽象。抽象不依赖细节,细节应该依赖抽象。通过依赖倒置,可以减少类与类之间的耦合性

迪米特原则:是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则,尽量降低类与类之间的耦合度。主要是类与类之间的关系准则,即只依赖有直接关系的类(属性、方法参数)

合成复用原则:多用组合,少用继承原则

3.什么是简单工厂模式、工厂方法模式、抽象工厂模式?

简单工厂模式:一个工厂类来创建某父类的一系列子类,封装了对象的创建细节。所有的创建细节都集中在单一工厂类,导致工厂类可读性较差。

工厂方法模式:各个对象的创建细节分摊到各个工厂类,由专门的工厂类生成专门的类。继续演进,需要生成一品类的对象时,势必导致工厂类膨胀.

抽象工厂模式:即可创建某品牌下一品类的产品。支持品牌的横向扩展,单对品类的纵向扩展较差。可以适配器模式扩展接口+组合原工厂类方法对品类扩展

4. 什么是单例模式,并说出2到3中不同的创建方式以及他们的优缺点?

单例模式,在单个进程即JVM中,某个类对象实例唯一份。

饿汉式模式:在类加载时就创建好单例对象。优点:无并发访问问题 缺点:加载时即创建,加载慢,浪费内存

懒汉式模式:在单例类使用时延迟初始化。优点:即时即用 缺点:并发问题,volitile + dcl优化

枚举模式:java中enum类,自然满足单例,也是官方推荐的实现方式

5.有哪些方式可以破坏单例模式,怎么解决单例破坏?

反射破坏,反射执行private的构造方法。构造方法加判断,如果单例不为空,抛异常

序列化破坏,重写readResolve方法

6.什么是浅克隆,什么是深克隆,实现深克隆的方式有哪些?

浅克隆:只拷贝基本类型的值,对于对象只复制对象引用地址,在堆中指向同一份对象

深克隆:不仅拷贝基本类型,所有对象属性均为不同对象

递归深克隆:递归克隆,直到属性为基本类型为止

序列化和反序列化:将对象通过序列化和反序列化的方式实现对象拷贝

7.实现动态代理的方式有哪些,以及他们的区别?spring用的是哪个代理模式?

JDK动态代理:被代理类必须实现接口,动态实现重写接口方法,并转交handle执行方法,反射调用被代理类方法

cglib动态代理:通过继承的方式实现代理,凡不可继承类或不可重写方法,均不可被代理即final类、final方法和static方法。采用方法索引的方法代理反射代理执行,在执行上比JDK代理要快

// AopProxy分为JDk和cglib实现,即工厂方法模式
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    // proxyTargetClass属性生效地方
    if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
        Class<?> targetClass = config.getTargetClass();
        if (targetClass == null) {
            throw new AopConfigException("TargetSource cannot determine target class: " +
                                         "Either an interface or a target is required for proxy creation.");
        }
        // 目标类是接口或已被JDK代理
        if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
            return new JdkDynamicAopProxy(config);
        }
        return new ObjenesisCglibAopProxy(config);
    }
    else {
        return new JdkDynamicAopProxy(config);
    }
}

从代码上可以看出,在spring中两种代理模式都有使用

8.什么是模板模式,它的作用在哪?

模板模式,即设计好算法框架,并预留扩展点。子类通过继承父类,并自定义实现扩展点方法,从而在不改变原代码的前提,实现代码复用和扩展。

9.什么是策略模式?优点缺点在哪?

策略模式即一组实现同一抽象的类对象,策略之间做的同一件事,在某种意义上可互相 替换,由子类选择使用哪种策略执行方法。

优点:减少if等分支语句,很好的将分支代码分散到各个策略类之中

缺点:客户端要知道所有策略类的存在,从中选中适用的策略类(策略类可提供match方法,从而遍历查询替代)

10.享元模式与注册式单例模式的区别?

享元模式:即通过共享不可变对象,从而减少内存消耗,侧重点是对象共享使用

单例模式:跟享元模式一样,都是对象的共享使用,不过侧重点为对象的唯一份,也就是限制对象的创建个数

11.什么是双亲委派?

双亲委派为JVM类加载的算法,即类加载时先用父类加载器加载,父类加载类不能加载时再用本身加载。

这样就能保证全限定名的类唯一份,从而保证安全

12.委派模式跟代理模式的区别?

委派模式:将方法的处理全权交由委派类,被委派类不用参与方法执行过程,委派更注重结果

代理模式:代理类在被代理类方法上增加额外逻辑,被代理类需要参与,代理更注重过程

13.什么是观察者模式?

观察者模式,即观察者和被观察者,观察者需要注册到被观察者上,被观察者发生变化的时候需要通知观察者,从而观察者做出处理。解耦了观察者和被观察者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值