面试最常问的设计模式

设计模式的分类(23种)
  • 创建型(5种)
    • 创建对象时,不直接实例化对象,根据特定场景,由程序创建对象
    • 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型(7种)
    • 用于帮助将多个对象组织成更大的结构
    • 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
  • 行为型(11种)
    • 用于帮助系统间各对象的通信,以及如何控制复杂系统中流程
    • 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

单例模式----要求能够返回对象的一个引用和一个获得实例的方法

  • 适合场景:

    • 需要频繁创建和销毁对象时
    • 创建对象耗时或消耗资源过多时
  • 使用实例:多线程的线程池设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制

  • 分类

    • 如果不需要延迟加载单例,可以使用枚举或者饿汉式,相对来说枚举性好于饿汉式(类初始化时,会立即加载该对象,线程天生安全,调用效率高)。
    • 如果需要延迟加载,可以使用静态内部类或者懒汉式,相对来说静态内部类好于懒汉式(类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象)。
工厂模式
  • 主要是为创建对象提供接口——降低程序的耦合性
  • 应用场景:
    • 编码时不确定需要哪种类的实例
  • 使用实例:要批量生产汽车,就不需要座椅、车轮这些一一去制造然后拼装,将制造汽车所需要的制造座椅、制造车轮这些共性设计成方法写出一个接口,不同的车在实现接口后就能创造不同品牌的车,再创建一个汽车工厂类,需要什么汽车,就创建什么汽车的对象去创建什么车
  • Spring IOC 中的工厂模式:当容器拿到了beanName和class类型后,动态的通过反射创建具体的某个对象,最后将创建的对象放到Map中。
  • Spring IOC 中的工厂模式创建 Bean:如果通过传统的一层一层调用,要创建很多对象,Spring使用工厂模式,由工厂创建Bean。Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。
代理模式
  • 通过代理控制对象的访问,可以在这个对象调用方法之前或之后去添加新的功能,在原有代码不修改的情况下,直接在业务流程中切入新代码,增加新功能
  • 静态代理:在程序运行前就已经存在代理类
  • 动态代理:利用 JDK 的 API,动态的在内存中构建代理对象
观察者模式
  • 观察者模式,又叫发布-订阅模式,主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。
  • 两种实现方式:
    • 推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。
    • 拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。
  • 使用实例:比如说微信公众号,假设微信用户就是观察者微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号,当这个公众号更新时就会通知这些订阅的微信用户。

适配器模式----将一个类的接口转换成客户希望的另外一个接口

  • 适配器模式有三种: 类适配器——继承
    对象适配器——继承+接口实现
    接口适配器——抽象类适配

  • 使用场景:

    • 系统需要使用现有的类,但这些类的接口不符合系统需要
    • 建立一个可以重复使用的类
  • 角色分类:
    目标接口(客户期待的接口)、需要适配的类、适配器(把原接口转换成目标接口)

  • 核心思想:
    实现需要适配的类的功能-----实现接口
    包含客户期待的目标接口

  • 使用实例:一个登录系统最开始的登录方法是login方法中判断账号+密码是否正确的方式登录;接着要改成短信登录,就继承原来的登录类,重写login方法,判断账号和短信验证码;如果要使用微信登录,就要继承原来的login方法,把他变成账号+微信验证的方法登录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值