面试之常见设计模式

设计模式

七大设计原则

单一职责
接口隔离
依赖倒转
里式替换
开闭原则
迪米特法则
合成复用

了解哪些设计模式

  • 单例模式
  • 代理模式
  • 策略模式
  • 观察者模式
  • 工厂模式

单例设计模式

内存中只有一个对象,创建方式:

  • 私有构造
  • 静态成员变量
  • 静态方法获取对象实例
    两种方式:懒汉式和饿汉式。两种方式的优缺点:懒汉式浪费内存没有实现延迟加载。

双检锁线程安全的懒汉

/**
 1. @author CVToolMen
 2. @date 2021-09-12 09:27
 3. 所谓线程安全的单例,是否安全是对于是否只创建一个实例来讲的
 */
public class DoubleCheckSingleton {
    private static volatile DoubleCheckSingleton instance;

    private DoubleCheckSingleton() {
    }

    public static synchronized DoubleCheckSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}

策略模式

项目中的具体场景我不同的流程在发起的时候需要走各种不同的逻辑,例如:。。。如果用。之前的方式。。。使用策略能带来那些好处。
大致的实现原理
定义一个strategy接口,每个流程都实现这个接口,然后定义一个通用的类,在这个类中吧strategy接口作为它的成员变量在构造函数里对具体选哪个类进行选择。
在这里插入图片描述
SpringBoot中策略的实现方式
https://www.cnblogs.com/konglxblog/p/16389629.html

观察者模式

Zookeeper的实现思想就是就是基于观察者模式。这种模式的特点就是:例如zookeeper作为Subject主题,dubbo服务作为观察者,主体发生变化的时候通知到对应的观察者,例如服务的上下线之类。本质其实就是zk里维护了一个服务的集合,在发成变化的时候循环遍历这个集合调用通知各个观察者的接口。示意图如下
在这里插入图片描述

代理模式

工厂模式

思想:讲实例化对象代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系解耦。从而提高代码的扩展性和维护性。举一个订餐的例子。
4. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
5. 工厂方法模式:将对象实例化推迟到子类。
6. 抽象工厂模式:简单工厂模式和工厂方法模式的结合,可以理解为对简单的工厂进行了进一步的抽象。
在这里插入图片描述

Spring中的设计模式

参照guide哥的总结:Spring用了那些设计模式

面试回答思路

提问可能的方式:项目中用到了哪些设计模式?了解哪些设计模式?

  • 讲自己了解哪些设计模式
  • 项目中怎么用的:先讲背景,再讲实现

可以像下面这样回答:
无论怎么问都要把自己知道的都说出来,包括设计模式的思想,能带来的好处,具体代码上怎么实现(类的继实现关系,调用关系讲清楚)。
回答方式:我对单例策略代理工厂观察者这些设计模式都有一定了解,项目中用到最多的是策略模式工厂设计模式也有用过,例如我上个项目中根据不同类型的流程走不同的逻辑就用到了策略。还有这个项目中我自己通过工厂+策略的方式实现下单逻辑的解耦。下单的时候:计价逻辑不一样,校验下单校验规则不一样(库存调商城接口,本地接口),订单号生成规则不一样,大量的if…else判断很恶心。代码逻辑,定义一个策略接口(计价方法,校验方法,订单号生成方法等),定义私有库和海外代购这两个类去实现这个接口定义一个获取bean实例的工厂方法,注入一个map来保存策略,Spring容器会自动把策略的实现类注入到map中,以beanId为key。然后使用的时候,根据不同的购买类型获取不同的bean实例。这样就避免了一系列的if,else判断。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值