前言
你在项目开发中都用到过什么设计模式,你是在哪些场景下使用的。本文重点对面试的问题进行介绍,祝愿每位程序员都能顺利上岸!!!
一、你知道工厂方法模式吗
通过不同的工厂生产不同的产品,进行使用;或者通过同一个工厂生产各种产品;
1.1 你有使用过简单工厂模式吗
通过定义一个产品,然后不同的工厂都可以来生产改产品。如果新增咖啡种类,不仅要增加具体的咖啡种类,还要修改点咖啡的代码。
需求:设计一个咖啡店点餐系统。
设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCofee】和拿铁咖啡【Lattecoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。
咖啡店根据客户下单的咖啡类型进而生产不同的咖啡
通过具体的工厂来创建产品
简单工厂包含如下角色:
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品:实现或者继承抽象产品的子类
- 具体工厂:提供了创建产品的方法,调用者通过调用不同的咖啡种类,来获取产品。
- 新增咖啡,具体的工厂也需要进行修改
1.2 你有使用过简单工厂方法模式吗
工厂方法模式的主要角色:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间-一对应。
调用关系
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
1.3 你有使用过抽象工厂方法模式吗
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
1.4 你有使用过策略模式吗
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
策略模式的主要角色如下
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
选择不同的策略模式进行调用
二、你们项目中是怎么使用设计模式的呢
2.1 策略模式+ 工厂模式 实现不同的方式的登录
根据不同的登录方式,选择不同的策略,如: 账号密码,验证码,微信扫码等。
- 定义: login 接口
- 3个实现:账号密码登录,验证码登录,微信扫码登录
- 项目启动注入不同的登录方式的bean,定义根据不同登录方式返回对应的bean
- 在登录controller 中根据不同的登录方式获取bean,然后进行登录;
2.1.1 定义一个登录的接口类
2.1.2 定义不同类型登录的具体实现
2.1.3 配置有哪些登录方式
2.1.4 项目启动获取到不同的登录方式bean
2.1.5 登录方法控制器进行不同方式的登录
2.2 责任链模式实现数据不同层面的验证
责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
责任链模式的角色
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
-客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
2.2.1 定义抽象处理者
2.2.2 定义不同的验证
2.2.3 定义验证的数据
2.2.4 定义责任链调用
总结
本文对项目中经常使用到的设计模式进行总结。